一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少。
如若不使用递归,可以这样写代码:
- for(i1=0;i1<=10;i1++)
- {
- for(i2=0;i2<=10;i2++)
- {
- ...
- for(i10=0;i10<=10;i10++)
- {
- if(i1+i2+...i10==90)
- print();
- }
- ...
- }
- }
无疑如此做的空间复杂度和时间复杂度是很高的,所以理想的方法是采用递归。
代码清单:
- #include <iostream>
- using namespace std;
- int sum;
- int store[10];
- void Output()
- {
- for (int i=9;i>=0;--i)
- cout << store[i] << " ";
- cout <<endl;
- ++sum;
- }
- void Cumput(int score,int num)
- {
- if(score<0 || score>(num+1)*10) //次数num为0~9
- return;
- if(num==0)
- {
- store[num]=score;
- Output();
- return;
- }
- for (int i=0;i<=10;i++)
- {
- store[num]=i;
- Cumput(score-i,num-1);
- }
- }
- int main(int argc,char* argv[])
- {
- Cumput(90,9);
- cout << " 总数: " <<sum<<endl;
- return 0;
- }