Python递归函数

本文介绍了Python中的递归函数,如计算阶乘的fact(n)函数,并探讨了尾递归优化以防止栈溢出。通过示例解释了如何将非尾递归转换为尾递归形式,尽管Python解释器并未对尾递归进行优化。此外,还展示了使用递归方法解决汉诺塔问题的move(n, a, b, c)函数。" 121464037,8305981,SQL编程学习:连接与集合操作详解,"['SQL', '数据库', 'database']
摘要由CSDN通过智能技术生成

#1、计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:
#fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n
def fact(n):
    if n==1:
        return 1
    else:
        return(n * fact(n-1))
print(fact(5))
print(fact(6))


解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

上面的fact(n)函数由于return n * fact(n - 1)引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:

def f(n):
    return f_iter(n,1)
def f_iter(n,tmpRes):
    if n==1:
        return tmpRes
    else:
        return f_iter(n-1,n*tmpRes)

print(fact(998))
print(f(997))  #大于这个数调用会栈溢出

尾递归调用时,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值