程序员打靶问题及解析

程序员打靶问题及解析

面试例题 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;

已复制到剪贴板