几个小例子来理解递归
一、 先来一点基础的认识:
1、递归是一个不断的将一个问题分成更小的子问题最终找到一个简单的基础问题,最后再由基础问题的解决逐步向上解决初始问题的过程。所以不难看出,递归其实是分为两部分的一个是向下的递推过程,另一个就是向上的回溯过程。
2、从上面我们已不难发现,在这个过程中,是存在着栈的先进后出的过程的。而二者的关系就是在调用函数的时候,python会分配一个栈帧来处理该函数的局部变量。当函数返回时,返回值就在栈的顶端,以供调用者访问。
这里需要注意的是:栈帧限定了函数所用变量的作用域。尽管反复调用相同的函数,但是每一次调用都会为函数的局部变量创建新的作用域。
形式上就是函数的自我调用。
3、那么如何去分析一个问题是否能够用递归的方法来解决,这就涉及到了递归三原则。
1)递归必须有基本情况。能够结束递归
2)递归算法必须能改变其状态向基本情况靠近
3)递归算法必须递归调用自己
二、上一点生动的栗子
这是一个最简单的递归过程了。但是却是属于麻雀虽小五脏俱全。
首先if语句,基本条件判定。
第4行,自我调用,这是后就建立了栈帧逐个存储stack[3,6,9,12,15,18]【右边是栈底】
第5行,print函数,直观地展现回溯过程。
def digui(n):
if n < 1:
return False
digui(n-3)
return print(n)
digui(18)
再来一个有点难度的,四柱汉诺塔,更多递归的栗子可以看那两篇第