首页 > 代码库 > 递归算法

递归算法

  所谓递归——函数的递归调用。c语言的这种特性给程序设计带来许多方便。尤其是接触数据结构时,会发现递归的出现频率非常之高,也行之有效~下面是笔者在接触递归这个东西时的一些个人总结和体会:

  1.直接或间接地调用函数本身。我们在程序设计时,往往要自己写一些函数来帮助整个解决方案的完成,有时一个函数中又要调用自身来帮助这个功能的实现。是不是被套话弄晕了?Don‘t worry~开个玩笑了。  

  2.一个简单的例子可以帮助理解递归——求阶乘。请看:

  n!=n*(n-1)!(n>=1);

    =1                 (n=0);

这是求阶乘的公式。我们显然可以写一个子函数来求n!(记这个函数是fac),可是注意到,求n!,我就要求(n-1)!。那么问题来了,求(n-1)! 所用到的函数不还是我们写的这个fac函数吗?

So,我们只要再次调用本身就ok了。下面给出子函数:

  int fac(int n)

  {

    int f;

    if(n<o) printf("error!");

    else if(n==0) f=1;

    else f=n*fac(n-1);

    return f;

  }

  看似好像不比循环简洁,可是,当写复杂一点的代码时,递归的优点就显露出来了。

  3.Execu me?不断调用,何其尽也?

  可以看到,上面的程序并不是一个死循环~原因就在于这句if(n==0) f=1;这就是递归的终止条件。

  总结:一个完整的递归应该有两个必要条件:1.终止条件。2.规模渐小。

  规模,又可以看做上面程序的n,他显然是渐小的。

  4.递归的两个分类

  1) 基于数学公式(如阶乘);

  2) 基于语义(难!);请看下面这个狗血的问题:

  5.Hanoi塔问题。

  可以概述为下面的描述:

技术分享

具体代码如下:

技术分享

技术分享

技术分享

输入3个时是这样的:

技术分享

 

 

 需要多久呢?n个盘子需要移动2^64-1次,假设一秒一次,需要多久呢?

 

 

——————答案是约600亿年!

 

哈哈,等你移完了,世界末日就到了~~~~可是计算机却帮我们实现了这一功能~~真心感到计算机的强大~~~~

 

  

递归算法