【数据结构与算法】递归

时间:2021-09-07 11:37:14

1. N个信封和N封信,全部装错的可能有多少种?

  如果第一封信和第二封信的信封和信交换,相当于缩小了问题规模D(n-2)

  如果第二封信不选择第一个信封,就类似于原来的问题D(n-1)

  所以问题的D(n)=D(n-2)+D(n-1)

 

2. 向上爬有N阶的楼梯,可以一次爬一阶,也可以两阶,求所有的方法?

  最后到达终点有两种可能性,一种是一步,那么前面的一共有D(n-1)中走法

  另一种是两步,那么前面一共有D(n-2)种走法。

  D(n)=D(n-2)+D(n-1)

 

3. 打印出N个数的所有排列?

  这一题涉及到回溯和递归。回溯和递归是一个比较难的问题。

 

4. 用递归的方法求N个数中最大的数及其位置。

   怎么找到位置还没有做出来。

class Program
   {
       static void Main(string[] args)
       {
           System.Console.WriteLine("Please input number:");
           int num1 = Convert.ToInt32(System.Console.ReadLine()) ;
           List<int> num=new List<int>();
           for (int i = 0; i < num1; i++)
           {
               num.Add( Convert.ToInt32(System.Console.ReadLine()) );
           }
         //  int count;
           System.Console.WriteLine(  calculateN(num));
        
           System.Console.ReadLine();
       }

       //比较两个数的大小
       static int larger(int one, int two)
       {
           if (one >= two)
               return one;
           else
               return two;
       }

       //递归的方法找到一个list中最大的数
       static int calculateN(List<int> a)
       {
           if (a.Count == 2)
           {
               return larger(a[0], a[1]);
           }
           else {
           return larger(a[0],calculateN(a.GetRange(1,a.Count-1)));
           }
       }
   }