递归和栈帧的调用原理

本文介绍了递归函数的概念,通过阶乘计算的例子展示了递归的使用。递归虽逻辑清晰,但易引发栈溢出。讨论了尾递归优化避免栈溢出,以及如何将普通递归转换为尾递归。同时,阐述了栈帧在函数调用中的作用,它是保存函数执行环境的数据结构,包括返回地址和局部变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归函数:一个函数在内部ji进行自身调用的函数。

举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示为:n x fact(n-1),只有n=1时需要特殊处理。

fact(n)用递归的方式写:

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

计算fact(5),计算过程如下: 

===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰

使用递归函数需要注意防止栈溢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值