递归算法(打靶)

本文通过递归算法解决射击运动员10枪击中90环的所有可能性问题,使用C#编程语言实现。文章详细介绍了递归算法的设计思路及具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

例题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次)

 

 

代码:

 

 

[c-sharp] view plain copy
  1. namespace Example1  
  2. {  
  3.     class Program  
  4.     {  
  5.         public static int sum;  //静态整数来存储可能总数  
  6.         public static int sums()  
  7.         {  
  8.             return sum;  
  9.         }  
  10.         public static void Main(string[] args)  
  11.         {  
  12.             int sum = 0;    //总数初始为0  
  13.             int[] array = new int[10];//定义一个数组来存储符合条件的组数据  
  14.             Compute(90, 9, array);//90环,10枪(1枪之后才开始num0-9)  
  15.             sum = sums();  
  16.             Console.WriteLine("总可能有:{0} 种", sum);  
  17.             Console.ReadKey();  
  18.         }  
  19.   
  20.         public static void Output(int[] store)  
  21.         {  
  22.             //for (int i = 9; i >= 0; --i)  
  23.             //{  
  24.             //    Console.Write("   {0}", store[i]);  
  25.             //}  
  26.             //需要打印数据较大,92378条,  
  27.             sum++;  //每打印一次,可能总数加1  
  28.         }  
  29.   
  30.         public static void Compute(int score, int num, int[] store)  
  31.         {  
  32.             if (score < 0 || score > (num + 1) * 10)//(1)剩余的环数小于0或大于剩余次数乘10  
  33.             {  
  34.                 return;//退出递归  
  35.             }  
  36.             if (num == 0)//(2)剩余次数为0,第10次才符合条件  
  37.             {  
  38.                 store[num] = score;  
  39.                 Output(store);  
  40.                 return;  
  41.             }  
  42.             else  
  43.             {  
  44.                 for (int i = 0; i <= 10; i++)//每枪的环数,0-10,11种  
  45.                 {  
  46.                     store[num] = i;//每抢的环数存到数据中  
  47.                     Compute(score - i, num - 1, store);  
  48.                     //递归,剩余环数减去当前这一抢的环数,剩余枪数减去1  
  49.                 }  
  50.             }  
  51.         }  
  52.     }  

转载于:https://www.cnblogs.com/nbalive2001/archive/2012/07/18/2596716.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值