递归函数

 描述:
    如果一个函数在内部调用自身本身,这个函数就是递归函数

递归函数特性:
    (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': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}
三级菜单

相关文章: