递归要和迭代比较来看。

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次「迭代」,而每一次迭代得到的结果会作为下一次迭代的初始值,因此迭代是从前往后计算的。

递归则是一步一步往前递推,直到递归基础,寻找一条路径, 然后再由前向后计算。

迭代是从前往后计算的,而递归则是先从后往前推,然后再由前往后计算,有「递」又有「归」。

通俗来讲:引自@lishichengyan

一个小朋友坐在第10排,他的作业本被小组长扔到了第1排,小朋友要拿回他的作业本,可以怎么办?

他可以拍拍第9排小朋友,说「帮我拿第1排的本子」,而第9排的小朋友可以拍拍第8排小朋友,说「帮我拿第1排的本子」...如此下去,消息终于传到了第1排小朋友那里,于是他把本子递给第2排,第2排又递给第3排...终于,本子到手啦!

这就是递归,拍拍小朋友的背可以类比函数调用,而小朋友们都记得要传消息、送本子,是因为他们有记忆力,这可以类比栈。

更严谨一些,递归蕴含的思想其实是数学归纳法:为了求解问题p(n),首先解决基础情形p(1),然后假定p(n-1)已经解决,在此基础上若p(n)得解,那所有问题均得解。

递归三要素

递归的定义:接受什么参数,返回什么值,代表什么意思 。当函数直接或者间接调???时,则发?了递归

递归的拆解:每次递归都是为了让问题规模变?

递归的出?:必须有?个明确的结束条件。因为递归就是有「递」有「归」,所以必须又有一个明确的点,到了这个点,就不用「递下去」,而是开始「归来」。

递归的过程

下面这个求 n! 的例子中,递归出口(确定递归什么时候结束)是fun(1)=1,递归体(确定递归求解时的递归关系)是fun(n)=n*fun(n-1),n&>1。

int fun(int n){
if(n==1)
return 1;
else
return n*fun(n-1);
}

递归经典案例还有斐波那契数列、?阶阶乘等,想要更好地掌握这个知识点,可以去听《递归四讲》哦~

《递归四讲》这门原价$199的课程,现在$1秒杀!

参与方式:

戳我免费试听后,添加九章Sunny微信jiuzhang15,回复【知乎递归】+试听报名截图即可$1购买本课程。


在程序语言中所谓「递归」,就是指一个函数「自己调用自己」。递归最简单的应用,就是遍历一棵树。

so,就以遍历树来进行举例说明。我们的操场上有一棵树,树上长了好多果子。树下的蚂蚁想搞明白树上到底长了几个果子,该怎么办呢?很简单,就是一个枝桠一个枝桠爬过去,遇到岔口先左后右。如果发现果子就记个数,如果前面没有分杈就返回上一个分杈处继续探索下一个枝桠直到这个分杈处的所有枝桠都被探索完。这就是递归实际执行的过程。

在上面的例子里面,我们可以发现:

1、树的分杈是有限的;2、有分杈的枝桠,可以看成一颗较小的、且完整的树;从第二点可知,树无论如何分杈,不会影响蚂蚁的爬行规则。所以,蚂蚁可以把每个分杈都当作一颗新的树来进行探索,无论这棵树有多大,只要认准这一点,就一定可以完全地爬完整棵树,一个枝桠都不会落下。于是,这只小蚂蚁就可以用递归的方法完整地探索完这棵树,搞明白到底长了几个果子了。写成代码就是:

int count = 0;
void explore()
{
if (枝桠数量 &> 0)
{
for (int i = 0; i &< 枝桠数量; i++) { explore(); if (发现果子) count++; } } }


推荐斯坦福大学公开课:抽象编程,里边对递归讲的很细致很清楚,应该是第7、8集的样子吧斯坦福大学公开课:抽象编程另外是课程主页,上边有一些这门课程的相关资源Stanford School of Engineering楼主看懂了别忘了感谢我

把当前栈空间内的状态想清楚了,就比较简单了


再来安利一下之前写的文章

CuKing:图解递归?

zhuanlan.zhihu.com图标

照著里面的图片从上往下看就ok了


推荐阅读:
相关文章