关于递归

niimp2 2009-08-21 02:24:40
1、打靶问题
一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种,下面用递归算法实现:(C++ 代码)
#include <iostream>
using namespace std;

int sum = 0;
int store[10];

void Output()
{
for(int i = 9; i >= 0; --i)
{
cout<<store[i]<<' ';
}//把store中存的数输出来
cout<<endl;
++sum;
}//定义output函数

void Compute(int score,int num)
{
if(score < 0 || score > 10 * (num+1))
return;//如果分数小于0或者大于100,则返回
if(num == 0) //十次调用完了,store数组已经存满数了
{
store[num] = score;
Output();//调用Output函数,作为程序的出口
return;
}//终止条件

for(int i = 0;i <=10; ++i)
{
store[num] = i;//当i=0的时候,store[9]=0,
Compute(score-i,num-1);
}
}

int main()
{
Compute(90,9);
cout<<"Sum="<<sum<<endl;
return 0;
}

===========解释下,具体的递归式如何实现的=========
...全文
158 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
niimp2 2009-08-24
  • 打赏
  • 举报
回复
看来自己功底还不深啊...
komai908 2009-08-24
  • 打赏
  • 举报
回复
DFS ?
eijikayn 2009-08-22
  • 打赏
  • 举报
回复
没想出特别好的方法,
假设一个函数f(N,M),求出N个10以内的数和为M的值,然后逆推过程也就是
第10次 f(10,100)+f(10,99)+...+f(10,90)
然后把这几个函数再分解
f(10,99)=f(9,90)+f(9,89)
f(10,98)=f(9,90)+f(9,89)+f(9,88)
...
以此类推
因为f(n,m)m最多为10n,
所以很容易得出f(n,10n)=1,f(n,10n-1)=n,f(n,10n-2)=C(N,2)+C(N,1)...f(n,10n-9)=...
因为最后只会有这10种情况的值.所以只要把这些分解完全部加起来就好了
heling2008 2009-08-22
  • 打赏
  • 举报
回复
学习学习
lxycoming 2009-08-22
  • 打赏
  • 举报
回复
学习
hustbbk626 2009-08-22
  • 打赏
  • 举报
回复
学习下
wanyuzhen 2009-08-22
  • 打赏
  • 举报
回复
使用store[9],store[8]......记录第一枪,第二枪环数......
sum记录已经射击的次数,score表示要得到的分数
store[num] = i;
Compute(score-i,num-1);
循环选择,接着计算下一枪,在回溯。
if(score < 0 || score > 10 * (num+1))
return;
score 比剩下所以射击次数全中的环数大或着score < 0,终止
dfkjsdhfks 2009-08-22
  • 打赏
  • 举报
回复
用回溯,每一次选择都有十种情况,在for循环中用递归的方法遍历一次。
jinwei1984 2009-08-21
  • 打赏
  • 举报
回复
好像用的是回溯搜索
niimp2 2009-08-21
  • 打赏
  • 举报
回复
能否具体点,讲个大概的思路就可以
starcat 2009-08-21
  • 打赏
  • 举报
回复
栈模拟。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧