一、什么是递归
递归是一种解决问题的方法,将问题分解为更小的子问题,直到得到一个足够小的问题可以 被很简单的解决。通常递归涉及函数调用自身。递归允许我们编写优雅的解决方案,解决可 能很难编程的问题。
1、从一个小例子来学习递归
例如:我们要计算一个列表[1,3,5,7,9]中元素的和,我们可以用如下代码:
假设没有while循环或for循环。你将如何计算整数列表的总和?我们可以把列表重写为一个完全括号表达式。如下所示:
事实上,我们可以使用以下的简化序列来计算最终的和。
那么这种方法用python就可以表示为:
注:我们这里可以把else后面的return分解一下,变为numlist[0]+numlist[1:][0]+
listsum(numlist[1:][1:])…
通过图可以表示为:
其中代码中的len(numlist)==1表示将问题转为化最简单的问题了。这时再进行返回即可得到全部答案。
2、递归的三个定理
像阿西莫夫机器人,所有递归算法必须服从三个重要的定律:
-
递归算法必须具有基线条件(即递归终止的条件)。
- 递归算法必须改变其状态并向基本情况靠近。
- 递归算法必须以递归方式调用自身。
从上一个例子中我们可以看出,
法则1:是其基本情况是长度为1的列表
法则2:由于基本情况是长度为1的列表,所以朝向基本情况的自然进展是缩短列表
法则3:调用本身
3、栈的调用与递归
栈是一种线性的链表
3.2 调用栈
其实上面的递归过程就是一个调用栈的过程:
如
def fact(x):
if x==1:
return 1
else:
return x*fact(x-1)
print(fact(5))
其实这个相当于这样一个过程
只要函数还没有结束,递归就会一直持续下去,博客中排序与搜索中归并排序和快速排序都是递归的一个经典过程。