问题:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种?请用递归算法编程实现。
(节选自《程序员面试》)
以下用C++实现。
#include <iostream>
using namespace std;
int sum;
int store[10];
using namespace std;
int sum;
int store[10];
//打印函数,符合要求的则把它打印出来
void Output()
{
for(int i = 9; i >= 0; i--)
cout << store[i] << " ";
cout << endl;
++sum;
}
void Output()
{
for(int i = 9; i >= 0; i--)
cout << store[i] << " ";
cout << endl;
++sum;
}
//递归函数
void Cumput(int score, int num)
{
//如果已经打的总环数超过90,此时score<0,或者剩下即使每次都打10环也无法打到
//90环,则退出循环
if(score < 0 || score > (num + 1) * 10) //次数num为0~9
return ;
void Cumput(int score, int num)
{
//如果已经打的总环数超过90,此时score<0,或者剩下即使每次都打10环也无法打到
//90环,则退出循环
if(score < 0 || score > (num + 1) * 10) //次数num为0~9
return ;
//如果满足条件且达到最后一次。
if(num == 0)
{
store[num] = score;
Output();
return ;
}
if(num == 0)
{
store[num] = score;
Output();
return ;
}
for(int i = 0; i <= 10; ++i)
{
store[num] = i;
Cumput(score - i, num - 1);
}
}
{
store[num] = i;
Cumput(score - i, num - 1);
}
}
int main(int argc, char* argv[])
{
Cumput(90, 9);
cout << "总数: " << sum << endl;
return 0;
}
{
Cumput(90, 9);
cout << "总数: " << sum << endl;
return 0;
}