Python-函数递归

一、首先了解下,函数的嵌套调用

def func1():
    print('from func1')
    func1()

func1()

此例子,递归调用没有结束条件,进入死循环。但python对它做了层级限制,不会进入死循环,避免内存溢出。

函数递归调用:在调用一个函数的过程中直接或间接地调用该函数本身,称之为函数的递归调用。

n=1
def func1():
    global n
    print('from func1',n)
    n+=1
    func1()

func1()

此例子可以看执行了多少次!

import sys
print(sys.getrecursionlimit())

python本身的层级限制(默认1000),这个值可以修改

import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)

n=1
def func1():
    global n
    print('from func1',n)
    n+=1
    func1()

func1()

继续下面例子:

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

def bar():
    func()

func()

==

def func():
    print('from func')
    func()

func()

二、递归定义

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

设计思路:
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=18

n!=1 #age(n)=age(n-1)+2
n=1 #age(n)=18
def age(n):
    if n == 1:
        res=18
        return res
    res=age(n-1)+2 #res=age(4)+2:age5等这一步的结果
    return res

print(age(5))

return 的作用是:返回值,结束当前调用。

进入下一次递归前,保存上一次递归结果,所以递归的效率不高!

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

实战一、

def bar():
    import time
    time.sleep(3)
    return 4

def foo():
    res=bar()+3
    return res

print(foo())

这里也可以写成:
def foo():
    return bar()+3

先执行retrun后面代码,再返回值!

实战二:

l=[1,2,[3,[4,[5,[6,7,[8,9,[10,[11,[12]]]]]]]]]
def get(l):
    for item in l:
        if isinstance(item,list):
            get(item)
        else:
            print(item)

get(l)
也可以写成:

if type(item) is list:

1、满足条件结束递归;

2、满足条件进入下一次递归。

posted @ 2017-10-17 21:37  大雄猫  阅读(1012)  评论(0编辑  收藏  举报