首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

野牛程序员爸爸教儿子学Python——递归回溯魔法秀:看代码如何“原路返回”!

野牛程序员爸爸教儿子学Python——递归回溯魔法秀:看代码如何“原路返回”!

递归与回溯:程序员的时光机!

嘿!今天野牛程序员爸爸带来一节超级酷的课,教你如何在递归中“时光倒流”,也就是“回溯”。别怕,这不是什么复杂的魔法,而是让代码自己走到终点后,再优雅地返回到原来位置的诀窍!就像你走进迷宫,找到出口后,又沿着来时的路回到起点,这就是回溯的神奇之处!

为了让大家更好地理解,我准备了几个简单有趣的例子,带你一步步体验递归和回溯的过程。准备好了吗?让我们出发吧!

简单例子:倒计时“回溯版”

我们先来看一个倒计时的例子。这个例子会展示当递归达到终点后,如何依次“返回”到最初的调用点,打印出回溯的信息。

执行结果:

在递归调用中,每一次函数调用都会压入调用栈,待递归结束后,再依次出栈。让我们用栈的角度来解释这段代码的执行过程。

栈的解释

调用countdown(3)

调用栈:[countdown(3)]

执行countdown(3)时,因为3 != 0,打印"倒计时:3"

然后调用countdown(2),此时countdown(3)暂停,状态保存到栈中。

调用countdown(2)

调用栈:[countdown(3), countdown(2)]

执行countdown(2)时,因为2 != 0,打印"倒计时:2"

然后调用countdown(1),此时countdown(2)暂停。

调用countdown(1)

调用栈:[countdown(3), countdown(2), countdown(1)]

执行countdown(1)时,因为1 != 0,打印"倒计时:1"

然后调用countdown(0),此时countdown(1)暂停。

调用countdown(0)

调用栈:[countdown(3), countdown(2), countdown(1), countdown(0)]

执行countdown(0)时,条件n == 0成立,打印"起飞!"

countdown(0)执行完毕,出栈。此时栈变为[countdown(3), countdown(2), countdown(1)]

回溯到countdown(1)

回到countdown(1)调用处,继续执行:打印"回溯到:1"

countdown(1)执行完毕,出栈。栈变为[countdown(3), countdown(2)]

回溯到countdown(2)

回到countdown(2)调用处,继续执行:打印"回溯到:2"

countdown(2)执行完毕,出栈。栈变为[countdown(3)]

回溯到countdown(3)

回到countdown(3)调用处,继续执行:打印"回溯到:3"

countdown(3)执行完毕,出栈。调用栈为空,程序结束。

总结

每一次调用countdown()时,都像是在调用栈上“压”进了一个盒子;当最底层的函数(countdown(0))执行完毕后,程序依次从栈中“弹出”,并在回溯过程中打印相应的“回溯到:n”信息。这正体现了栈的**后进先出(LIFO)**的特性。每次回溯,就是栈中保存的调用状态依次恢复执行的过程,就像你走进迷宫,最后按原路返回那样清晰明了!

四、回溯:让递归变得井然有序!

通过今天的例子,我们明白了递归回溯的精髓:

倒计时例子展示了递归到达基准后,如何一步步返回打印“回溯到:”信息,清晰展示了函数调用的回溯过程。

回溯就像是一部时光机,让你在递归的深处走到尽头后,沿着原路返回,保证程序的结构完整又井然有序。只要你理解了这一点,任何递归问题都能迎刃而解!

野牛程序员爸爸坚信,只要你掌握了递归和回溯的魔法,你的编程世界就会变得更神奇、更有条理!继续加油,小小编程天才,未来的编程高手就在你脚下!

下次,我们将继续探索更多Python的神奇领域,带你解锁更高级的编程技巧!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O7Rxpz9A9T26nJrlp2F5BzzQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券