递归算法 笔记

   递归算法

在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法。

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。在实际编程中尤其要注意栈溢出问题。

借助递归方法,我们可以把一个相对复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。但在带来便捷的同时,也会有一些缺点,也即:通常用递归方法的运行效率不高。

1、 Fibonacci数列

兔子问题

有一对幼兔,幼兔1个月后长成小兔小兔1个月后长成成兔后并生下一对幼兔,问2年后有多少只兔子

 

static void Main(string[] args)
        {
  int time=24;

            int  tuzi =Hanshu(time);
            Console.WriteLine(tuzi);
        }
        static int  Hanshu(int n)
        {
            if  (n< 0) {return -1;}
            if  (n==0) {return 0;}
            if  (n==1) {return 1;}
            
            return Hanshu(n-1)+Hanshu(n-2);
        }

  2 汗诺塔问题

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

1、每次只能移动一个圆盘;

2、大盘不能叠在小盘上面。

提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

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);
      }
    }

  

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

 

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

 

  

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

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

  

 

转载于:https://www.cnblogs.com/zoubizhici/p/5436312.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值