python递归函数的尾递归优化

python递归函数的尾递归优化

参考:廖雪峰python教程

递归函数:函数内部调用自身来完成计算。

比如我们要计算阶乘n! = 1 x 2 x 3 x ... x n,用函数function1来表示,可采用如下写法。

def function1(n):
    if n==1:
        return 1
    return n*function1(n-1)

递归函数优点是定义简单,逻辑清晰。但是由于在计算机中通过系统栈来实现,所以当调用递归函数次数过多时,就会产生溢出。

为了解决溢出现象,可以使用尾递归来实现对递归函数的优化。尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式,黑体字是防止溢出的关键。这样就可以使递归函数无论被调用多少次都只有一个栈帧被使用。

改进:

def function2(num, product):
    if num == 1:
        return product
    return function2(num-1, num*product)

尾递归调用时,栈不会增长。

===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20)
===> fact_iter(2, 60)
===> fact_iter(1, 120)
===> 120

遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

递归实现汉诺塔:

def move(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
        move(n-1, a, c, b)
        print(a, '-->', c)
        move(n-1, b, a, c)

你可能感兴趣的:(python)