递归函数
描述:
如果一个函数在内部调用自身本身,这个函数就是递归函数
递归函数特性:
(1)必须有一个明确的结束条件
(2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少
(3)相邻两次重复之间有紧密的联系,前一次要为后一次做准备
(4)递归效率不高,递归层次过多会导致溢出
首先,我们可以从字面上来理解递归函数
递:传递出去的意思
归:回来的意思
递归函数就是一个有去有回的过程,以下一个简单的例子来解释递归函数:
实例:
计算一个10以下(包括10)整数的加法运算:
(1)初级写法:
n = 0
for i in range(11):
n += i
print(n)
(2)中级写法:
使用 reduce 高阶函数进行累计运算
from functools import reduce print(reduce(lambda x, y: x+y, range(11)))
(3)递归函数的写法:
def add(n):
if n == 1:
return n
else:
return n + add(n -1)
print(add(10))
这三种方法,显然第二种是最简单的,但是这里是为了研究递归函数的用法,要了解递归函数的工作流程,就需要分解递归函数。
这里只是为了说明问题,调用 add(5) :
def add(n): # n = 5
if n == 1:
return n
else:
return n + add(n -1) # 5 + add(5 -1)
def add(n): # add(4)
if n == 1:
return n
else:
return n + add(n -1) # 4 + add(4 -1)
def add(n): # add(3)
if n == 1:
return n
else:
return n + add(n -1) # 3 + add(3 -1)
def add(n): # add(2)
if n == 1:
return n
else:
return n + add(n -1) # 2 + add(2 -1)
def add(n): # add(1)
if n == 1: # n = 1
return n # return 1
else:
return n + add(n -1)
以上是我们通过代码执行流程分解出来的过程信息。
每当函数内部调用自身的时候,外部函数挂起,执行内部函数,当内部函数执行完毕,然后在执行外部函数;
用简单的图形来表示,如下:
===> add(5) ===> 5 + add(4) ===> 5 + (4 + add(3)) ===> 5 + (4 + (3 + add(2))) ===> 5 + (4 + (3 + (2 + add(1)))) ===> 5 + (4 + (3 + (2 + 1))) ===> 5 + (4 + (3 + 3)) ===> 5 + (4 + 6) ===> 5 + 10 ===> 15
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
实例:
使用递归函数实现一个三级菜单的效果
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, }