路飞学诚-python集训营-第二章-递归

本文通过一个生动的故事介绍了递归函数的概念,并深入探讨了递归函数的工作原理、与栈的关系、特性及其潜在的问题,如栈溢出等。

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

  • 递归的介绍

首先,我们来讲一个故事:从前有座山,山里有座庙,庙里有个老和尚再给小和尚讲故事。

讲:"从前有座山,山里有座庙,庙里有个老和尚再给小和尚讲故事。"


讲:"从前有座山,山里有座庙,庙里有个老和尚再给小和尚讲故事。"。。。。。。

这可能是我们最早接触到的“递归函数”

def calc(n):
    print(n)
    if int(n/2) ==0:
        return n
    return calc(int(n/2))
 
calc(10)
 
输出:
10
5
2
1

函数calc先传进一个参数10经过函数体,在return是,把n/2返回calc中继续执行,知道n/2等于0截至。

这就是递归函数。递归函数主要用于解决数学难题。


  • 递归与栈的关系

在程序中,函数是存储在栈中,栈就好比弹壳,函数运行的数据就是弹药。在递归函数中,没递归一次,就好比在弹夹中压入一颗子弹。弹夹容量是有限制的,也就是说如果无限递归,早晚会撑爆弹夹。这也就是递归与栈的关系。


  • 递归的特性

上代码:

def calc(n):
    v=int(n/2)
    print(v)
    if v==0:
        return
    calc(v)
    print(v)
calc(10)

为什么会有这个结果?


每递归一次,就会有一个新的函数在执行,然而在下一层函数没有执行完毕之前,上一层函数就无法关闭,但是在下一层函数中还会继续调用函数。也就是说,在递归中,最后一层函数没有执行完毕前,他所有上层函数都是处在执行的状态,当最后一层执行完毕后,会由里到外,一层层执行关闭,这也是为什么会出现上面运行结果的原因。


结合上述,我们来总结下递归的特性。


1.必须有一个判断条件来结束递归。

2.每递归一次,问题的规模都会比上一层递归有所减少,都会更接近我们的判断条件。

3.递归效率不高,多次递归可能导致栈溢出。


  • 尾递归优化

我们都知道return是函数结束的标志,所以以return返回函数的方法调用自己,可以在执行下一层函数的时候关闭当前函数。

不过这种return不能附带当前层参数的运算,比如return n*func(n-1)

因为在你调用下一层函数的时候,还要与当前层参数运算,下一层不结束,就不能返回值与当前层参数运算,所以当前层函数就要等待下一层返回值。也就不能关闭当前层函数。多了这么多,这种优化方式在python中不支持,所以。呵呵




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值