码迷,mamicode.com
首页 > 编程语言 > 详细

Python:函数递归

时间:2018-06-10 12:03:12      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:lse   优化   lex   年龄   pre   IV   流程分析   调用   返回   

Python:函数递归

定义:在调用一个函数的过程中直接或间接的调用该函数本身,称之为递归调用。递归调用最多能调用999层。

基础模型:  

def func():
    print(from func)
    func()    #直接调用自身
    
func():

 

def func():
    print(from func)
    bar()    #间接调用自身

def bar():
    print("from bar")
    func()

func()

虽然以上两中方式为函数递归的基础模型,但往往不能直接这样使用。因为没有一个函数的结束条件,仅仅相当于一个死循环。

 

递归分为两个重要的阶段: 递推+回溯

  递推:函数不断减少问题规模直至最终的终止条件。

  回溯:拿到最终明确的值后,返回给上次调用进行处理,直至初始层。

 

 练习题:解决年龄问题,求出alex的年龄

"""
alex 他比佩奇 大两岁。  4   age(3) + 2
佩奇 他比日天 大两岁。  3   age(2) + 2
日天 他比太白 大两岁。  2   age(1)  + 2
太白:我今年23.         1   23
"""

def age(n):
    if n == 1:
        return 23
    else:
        return age(n-1) + 2

print(age(4))      #这里的4表示解决问题的规模

29

 

流程分析:

"""
def age(4):
    if n == 1:
        return 23
    else:
        return age(3) + 2   23 + 2 + 2 + 2

def age(3):
    if n == 1:
        return 23
    else:
        return age(2) + 2   23 + 2 + 2
         
def age(2):
    if n == 1:
        return 23
    else:
        return age(1) + 2    23 + 2
        
def age(1):
    if n == 1:
        return 23
    else:
        return age(0) + 2

"""

 

  注意在Python:
    1、递归调用必须有一个明确的结束条件
    2、在python中没有尾递归优化,递归调用的效率不高
    3、进入下一次递归时,问题的规模必须降低

 

 简单应用场景:

取出列表  l=[1,2,[3,[4,[5,[6,[7,[8,9,[10]]]]]]]] 中的所有元素

def get(l):
    for item in l:
        if isinstance(item, list):
            get(item)     #如果元素为一个列表,那么递归调用自己把该列表传给get()函数,进行递归调用
        else:
            print(item)
get(l)

 

Python:函数递归

标签:lse   优化   lex   年龄   pre   IV   流程分析   调用   返回   

原文地址:https://www.cnblogs.com/bailo/p/9162270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!