菜鸟每天练习 之 递归算法(打靶)

例题1一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种?请用递归算法编程实现。[中国某著名通信企业H面试题]

解析:靶上一共有10种可能——1环到10环,还有可能脱靶,那就是0环,加在一起共11种可能。这是一道考循环和递归的面试题。我们在这个程序中将利用递归的办法实现打靶所有可能的演示,并计算出结果。(可以连续用10个循环语句来表示程序)

for (i1=0;i1<=10;i1++)

 {

      for (i2=0;i2<=10;i2++)

      {

          for (i3=0;i3<=10;i3++)

          {

              ……

                for (i10=0;i10<=10;i10++)

                  {

                      if(i1+i2+i3+…+i10=90)

                      Print();

                 }

              ……

          }}}

注意2个条件:

1)如果出现这种情况,即便后面每枪都打10环也无法打够总环数90,在这种情况下就不用再打了,则退出递归。

(2)如果满足条件且打到最后一次(因为必须打10次)

代码:

namespace Example1 { class Program { public static int sum; //静态整数来存储可能总数 public static int sums() { return sum; } public static void Main(string[] args) { int sum = 0; //总数初始为0 int[] array = new int[10];//定义一个数组来存储符合条件的组数据 Compute(90, 9, array);//90环,10枪(1枪之后才开始num0-9) sum = sums(); Console.WriteLine(“总可能有:{0} 种”, sum); Console.ReadKey(); } public static void Output(int[] store) { //for (int i = 9; i >= 0; –i) //{ // Console.Write(” {0}”, store[i]); //} //需要打印数据较大,92378条, sum++; //每打印一次,可能总数加1 } public static void Compute(int score, int num, int[] store) { if (score < 0 || score > (num + 1) * 10)//(1)剩余的环数小于0或大于剩余次数乘10 { return;//退出递归 } if (num == 0)//(2)剩余次数为0,第10次才符合条件 { store[num] = score; Output(store); return; } else { for (int i = 0; i <= 10; i++)//每枪的环数,0-10,11种 { store[num] = i;//每抢的环数存到数据中 Compute(score – i, num – 1, store); //递归,剩余环数减去当前这一抢的环数,剩余枪数减去1 } } } } }

    原文作者:递归算法
    原文地址: https://blog.csdn.net/jin2004406/article/details/6448005
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞