递归

  • 栈非常重要的一个应用就是在程序设计语言中用来实现递归。递归是指在定义自身的同时又出现了对自身的引用。如果一个函数在其定义体内直接调用自己,则称为直接递归函数;如果一个函数经过一系列的中间调用语句,通过其他函数间接调用自己,则称为间接递归函数。

  • 许多数学函数是递归定义的,如二阶斐波那契数列定义和阿克曼函数定义


// 已知二阶fibonacci数列:fib(n)=0,若n=0;fib(n)=1,若n=1;fib(n)=fib(n-1)+fib(n-2),其他情况。定义递归函数求fib(n).

int fib(int n)
{
if(n==0)return 0;
else if(n==1)return 1;
else return fib(n-1)+fib(n-2);
}

  • 使用递归算法的前提有一下两个:

    • 原问题可以层层分解为类似的子问题,且子问题比原问题的规模更小。
    • 规模最小的子问题具有直接解。
  • 设计递归算法的原则是用自身的简单情况来定义自身。设计递归算法的方法如下:

    • 寻找分解方法:将原问题转化为子问题求解。例如,n! = n(n-1)!
    • 设计递归出口:根据规模最小的子问题确定递归终止条件。例如求解n!,当n = 1时,n! = 1
int f(int n)
{
    if (n == 0) return (1);
    else
        return (n * f*(n - 1));
}

推荐阅读更多精彩内容

  • 本文有七千字,阅读大约需要占用你10分钟时间。 好吧。。随便写的,我也不知道会花多久看完。因为写的比较烂,而且只是...
    锅与盆阅读 6,390评论 5 36
  • 最近高等代数正好讲到这里,此篇文章正好对所学知识做一个具体程序实践。 设计算法时使用递归的思想是一个程序员的基本素...
    FrancisSoung阅读 2,623评论 2 3
  • 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大奖:点击这里领取 在...
    HetfieldJoe阅读 1,235评论 0 15
  • 弟弟需要找一张父母的合照,去参加一个母亲节的活动。 我刚想起,是否我这里存的有,便打开来寻找,想着可以发给他。后来...
    折草阅读 58评论 0 0
  • 诗人不说别人的话 夜深蓝蓝天空属于他们 星月才懂的 他们也会懂 时节转换迎归秋至 每一缕风每一片雨 会带走夏末 带...
    卑以自牧阅读 45评论 0 0