最近在b站观看了有关“递归算法”的视频(链接https://www.bilibili.com/video/BV194411f71o) ,下面有一个小伙伴举了一个例子,如图:

笔者瞬间感觉他这个说法很有意思,把整个原理的过程都贯彻的很清楚。于是我把他所说的内容用代码模拟一下。下方是代码(为了更强的直观性,我使用了time.sleep()进行了处理,请忽略我的typo):

import time
pack=1
money=50
sessiors=False
def open_pack():
    global pack
    while pack!=0:
        if sessiors == True:
            print('我用剪刀剪开了所有包裹')
            time.sleep(1)
            pack-=pack
        elif money!=0:
            print('现在{}个包裹打不开,买把剪刀吧'.format(pack))
            time.sleep(1)
            buy_sessiors()
            return
        elif money == 0:
            print('没钱了,只能用口咬开')
            time.sleep(1)
            open_by_mouse()
def open_by_mouse():
    global pack,sessiors
    print('我咬开了1个包裹,得到了剪刀一个')
    time.sleep(1)
    pack-=1
    sessiors=True
    open_pack()
def buy_sessiors():
    global pack,money
    pack+=1
    money-=10
    print('购买成功,我还有{}块,有{}个在包裹里的剪刀'.format(money,pack-1))
    time.sleep(1)
    open_pack()
print('我要开一个包裹')
open_pack()

上方例子中,有一个目的:打开包裹(open_pack)。

由于我没有剪刀(sessiors=False),我只能花10元买一把剪刀(buy_sessiors函数),购买一把剪刀后包裹会+1(pack+=1)。

然后我为了打开包住剪刀的包裹(buy_sessiors后继续open_pack)我会再花10元购买一把剪刀....而我终究会没钱,没钱了我就只能把包装较为简单的剪刀包装咬开(open_by_mouse函数),这样包裹-1,我有剪刀了(sessiors=True),那么我就能打开所有包裹。

如果不考虑金钱因素,我就会陷入不断买剪刀的的操作。这样从直观而言包裹就会堆满我家,从计算机角度而言,这样就会堆栈溢出(栈都是递来的函数)。也就是说我只递,而没得归,那么程序就会崩溃。

有人觉得这上面的实例太脱离实际了,那么我就举出另一个相对贴切的例子:

我们高中电脑老师在简介递归时举例查字典的例子,这和上面也相同:用英文字典(纯英文)查一个单词,而释意带来更多的我不会的单词,我会依次查我不会的,直到我会了为止。用上面的实例来说,不断的调用查单词函数,而我终究能学会所有释意里的单词,全部学会后我自然就知道这个单词的意思。那么全部会了就不再调用查单词函数了,自然递归停止,完成预期目标。

那有人问到了:那么这个查单词的人词汇量不足呢?的确,若人(程序)词汇量不足(不能达到停止条件),就会不断产生新的不会的单词(自始至终没有“归”给我这个单词啥意思),那么这个学渣就会造成溢出(都记不得自己要干啥了)。没有在适当的时候停止递归,那对程序而言这就是bug(人的话...重开吧...)。

如果说程序的确需要那么多次递归(这个人查一个晚自习单词都能不忘初心,他认为我查一节课字典才能乱杀)才能完成目标,在python中可以使用下图代码更改限定递归次数

求问maximum recursion depth exceeded怎么解决_百度知道 (baidu.com)

总之,递归就是一个套娃,而它要在堆栈还能撑住时返回结果。在我发现我已经在误导人之前,我还是尽快完成这篇文章吧..大家可以看看文章开头的视频,里面的介绍很不错!

十分感谢大家的观看,欢迎大家在下方评论区指正!

届ける言葉を今は育ててる
最后更新于 2021-07-02