递归编程盘点

来源:互联网 发布:湖北侦破网络传销 编辑:程序博客网 时间:2024/06/14 00:41

递归编程:

一般来说,递归需要有边界条件。当条件不满足时,递归前进;当条件满足时,递归返回。

注意:<1>.递归就是在过程和函数里调用自身;

    <2>.明确的递归约束条件,即递归出口。

经典案例(封装方法):

1.小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.

到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?

 public static int PeachOfMonkey(int day) {
            if (day>10) {
                Console.WriteLine("天数不能大于10");
                return 0;
            }
            if (day ==10) {//当天数10,返回1
                return 1;
            }

            return (PeachOfMonkey(day + 1) + 1) * 2;//天数越靠近结束条件,执行递归次数越少

2.斐波那契数列(兔子数列)
public static int Fibonacci(int n) {
            if (n == 1) {
                return 1;
            }
            if (n == 2) {
                return 1;
            }
            if (n<=0) {
                return -1;
            }


            return Fibonacci(n-1)+ Fibonacci(n-2);
        }

3.汉诺塔问题
public static void hannoi(int n, string from, string buffer, string to) {
            if (n == 1) {
                Console.WriteLine("Move disk " + n + " from " + from + " to " + to);
            }
            else {
                hannoi(n - 1, from, to, buffer);
                Console.WriteLine("Move disk " + n + " from " + from + " to " + to);
                hannoi(n - 1, buffer, from, to);
            }
        }
4.角谷定理
     
        角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。
      
        public static int KakutaniTheorem(int num) {
            if (num == 1) {//二进制数,最左边数字,必须为0,。故递归方法的结束条件num==1
                return 0;
            }
            if (num % 2 == 0) {
                Console.Write(num / 2 + " ");
                return KakutaniTheorem(num / 2) + 1;//KakutaniTheorem(num / 2) 当前数需要运算的次数,每调用一次,次数加一
            }
            else {
                Console.Write(num * 3 + 1 + " ");
                return KakutaniTheorem(num * 3 + 1) + 1;//KakutaniTheorem(num / 2) 当前数需要运算的次数,每调用一次,次数加一
            }