图解递归
通俗地讲,递归即调用函数自身,很容易让人想到套娃玩具。但代码写出来又很让人不解,一个函数调用另一个函数很好理解,但调用自身什么鬼?因为这不是人类能轻易想象的结构。
递归是用栈来实现的,画出函数的进栈出栈图可以清楚看出其执行过程。
这里我们不使用栈,而从程序运行流程中理解。
我们从以下两点分析递归:
1、退出条件:必定有一个条件能结束递归,否则会死循环。函数的每次迭代都要使得向结束条件靠拢。
2、函数功能:函数每次迭代都会完成某一特定功能,而这才是递归的目的。
考虑如下两个递归函数:
这是两个简单的递归函数,以 func4为例,它的退出条件是x>0,func4(x-1)是对自身的调用,而函数实现的功能则是print(x).
func4 单次执行流程如下:
多次递归调用的情况就是:
最内层调用,x=1时不满足条件时会跳出递归,但程序是自上而下执行的,于是有输出1,2,3,4:
同样的思路我们可画出func3程序执行流程图:
x=1时退出递归,结果会一层层向外返回,但程序总是自上而下执行,所以输出结果就是4,3,2,1.
小结
这篇文章从程序流程角度给出递归的工作方式,希望大家对递归有更直观地感受,并没有讲解什么深刻内容。有n多文章从理论角度解读递归,很优秀,也很深刻。我不再举例了,有兴趣同学可以自行百度。