C# 递归算法!收藏

          今天无所事事,于是重温了一下递归算法。突然之间发现递归算法很好用。

           首先碰到的是这样的一首题目:计算数组{1,1,2,3,5,8.......} 第30位值,不用递归,我写出了以下这样的代码:

 

  1. static void Main(string[] args)  
  2.       {  
  3.           int[] num=new int[30];  
  4.           num[0]=1;  
  5.           num[1]=1;  
  6.           int first=num[0];  
  7.           int second=num[1];  
  8.           for (int i = 2; i < num.Length; i++)  
  9.           {  
  10.               num[i] = first + second;  
  11.               first = second;  
  12.               second = num[i];  
  13.           }  
  14.           Console.WriteLine(num[29]);  
  15.           Console.ReadLine();    
  16.       }  

       写出来,十分的累赘,于是改为归递算法来写,一目了然,十分明了。以下是代码:
       

  1. static void Main(string[] args)  
  2.        {  
  3.            Console.WriteLine(Process1(30));  
  4.            Console.ReadLine();   
  5.        }  
  6.  
  7.        public static int Process1(int i)  
  8.        {  
  9.            //计算数组{1,1,2,3,5,8.......} 第30位值  
  10.            if (i == 0) return 0;  
  11.            if (i == 1) return 1;  
  12.            else 
  13.                return Process1(i - 1) + Process1(i - 2);  
  14.        } 

做了一些练习:

1. 计算1+2+3+4+...+100的值

  

  1. static void Main(string[] args)  
  2.      {  
  3.           Console.WriteLine(Process2(100));  
  4.           Console.ReadLine();  
  5.       }  
  6.  
  7.       public static int Process2(int i)  
  8.       {  
  9.           //计算1+2+3+4+...+100的值  
  10.           if (i == 0) return 0;  
  11.           return Process2(i - 1) + i;  
  12.       } 

    

2. 计算1 -2 +3 +-4+ 5- 6 + 7 - 8 + 9的值
  

  1. static void Main(string[] args)  
  2.        {  
  3.            Console.WriteLine(Process3(9) - Process3(8));  
  4.            Console.ReadLine();    
  5.        }   
  6.  
  7.        public static int Process3(int i)  
  8.        {  
  9.            //计算1 -2 +3 +-4+ 5- 6 + 7 - 8 + 9的值  
  10.            if (i == 0) return 1;  
  11.            if (i == 1) return 2;  
  12.            else return Process3(i - 2) + i;  
  13.        } 

    

3.汉诺塔问题       

  1. static void Main(string[] args)  
  2.        {  
  3.            Hanoi(5, 'A''B''C');  
  4.            Console.ReadLine();  
  5.        }  
  6.  
  7.        public static void Hanoi(int n ,char A, char B, char C)  
  8.       {  
  9.            //汉诺塔问题  
  10.            //将n个盘子从A座借助B座,移到C座  
  11.            if (n == 1) Move(A, C);  
  12.            else 
  13.            {  
  14.                Hanoi(n - 1, A, C, B);  
  15.                Move(A, C);  
  16.                Hanoi(n - 1, B, A, C);  
  17.            }  
  18.        } 

实例

有一对兔子,每隔三个月会产下一对小兔子,小免子每隔三个月,也会产生新的一对免子,问36个月后,共有多少对兔子。

递归解法

  1. private int CreateRabbits(int rabbitNum, int month)  
  2.         {  
  3.             if (rabbitNum % 2 != 0)  
  4.                 throw new ArgumentOutOfRangeException("rabbitNum""兔子个数必须是2的整数倍!");  
  5.             int totalRabbitNum = 0;  
  6.  
  7.             if (month < 3)  
  8.                 totalRabbitNum = rabbitNum;  
  9.             else 
  10.             {  
  11.                 totalRabbitNum = rabbitNum * 2;//等效于totalRabbitNum = rabbitNum + (rabbitNum / 2) * 2  
  12.                 totalRabbitNum = this.CreateRabbits(totalRabbitNum, month - 3);  
  13.             }  
  14.             return totalRabbitNum;  
  15.         } 

在主程序中,输出Console.WriteLine(CreateRabbits(2,36))

循环解法 

  1.    public static void ss(int rabbitNum, int month)
     {
      int count = month / 3;
      int sum = rabbitNum;
      for (int i = 0; i < count; i++) {
       sum = sum * 2;
      }
            Console.WriteLine(sum);
           }
        }