程序员打靶问题及解析
程序员打靶问题及解析
面试例题 1:一个射击运动员打靶,靶一共有 10 环,连开 10 枪打中 90 环的可能性有多少种?请用递归算法编程实现。[中国某通信企业 H面试题]
解析:靶上一共有 10 种可能——1 环到 10 环,还有可能脱靶,那就是 0 环,加在一起共 11 种可能。这是一道考循环和递归的面试题。我们在这个程序中将利用递归的办法实现打靶所有可能的演示,并计算出结果。读者会问,难道一定要使用递归?当然不是。我们也可以连续用 10个循环语句来表示程序,代码如下:
for (i1=0;i1 (num+1)*10 ) //次数num 为0~9
{
return;
}
(2)如果满足条件且打到最后一次(因为必须打 10 次),代码如下:
if(num == 0)
{
store2[num] = score;
Output( store2);
return;
}
(3)如果没有出现以上两种情况则执行递归,代码如下:
for(int i = 0; i =0; --i)
{
Console.Write(" {0}",store2[i]);
}
Console.WriteLine;
sum++;
}
答案:
用 C#编写的完整代码如下:
using System ;
public class M
{
//public static int store;
//相当于设置了全局变量
//这个全局变量sum 是包含在M 类中的
public static int sum;
public M
{
int sum =0;
// int store = {1,2,3,4,5,6,7,8,9,0};
}
//打印函数
//符合要求的则把它打印出来
public static void Output(int store2)
{
for(int i = 9; i>=0; --i)
{
Console.Write(" {0}",store2[i]);
}
Console.WriteLine;
sum++;
}
//计算总数,返回 sum 值
public static int sum2
{
return sum;
}
public static void Cumput(int score, int num, int store2 )
{
//如果总的成绩超过了90 环(也就是 score (num+1)*10 ) //次数num 为 0~9
{
return;
}
//如果满足条件且达到最后一层
if(num == 0)
{
store2[num] = score;
Output( store2);
return;
}
for(int i = 0; i
using namespace std;
int sum;
int store[10];
void Output
{
for(int i = 9; i>=0; --i)
{
cout (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<<"总数:"< return 0;