• 递归算法(打靶)


    例题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 plaincopy
    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.     }  

  • 相关阅读:
    线程中断总结
    线程的基本协作和生产者消费者
    synchronized总结
    线程基础总结
    Java集合总结(三):堆与优先级队列
    Java集合总结(二):Map和Set
    Java集合总结(一):列表和队列
    java枚举类型总结
    java 内部类简单总结
    java Integer包装类装箱的一个细节
  • 原文地址:https://www.cnblogs.com/nbalive2001/p/2596716.html
Copyright © 2020-2023  润新知