python-3.x - 递归问题中使用不同参数多次调用的函数
问题描述
我对编程还很陌生,我刚刚被介绍给递归的概念。我遇到了著名的河内塔问题。以下是我正在关注的课程中的那个人如何解决它:
def printmove(fr,to):
print('move from'+ str(fr)+'to'+str(to))
def Towers(n,fr,to,spare):
if n == 1:
printmove(fr,to)
else:
Towers(n-1,fr,spare,to)
Towers(1,fr,to,spare)
Towers(n-1,spare,to,fr)
Towers(4,"P1","P2","P3")
我不明白的是(很可能它很明显,但我无法理解它)它如何知道何时传递给第二个递归调用 Towers(1,fr,to,spare)?
解决方案
它如何知道何时传递给第二个递归调用 Towers(1,fr,to,spare)?
实际上,这些递归函数之间的执行顺序是由这个控制块决定的;
if n == 1:
printmove(fr,to)
正如你所看到的,一旦n变量达到值1,else 语句将不会再次被访问,这就是函数执行将结束的原因(递归将中断)。一旦结束,程序流程将继续执行下一行代码,即Towers(1,fr,to,spare)
. 对于您的具体示例,您已将整数值4传递给您的函数调用Towers(4,"P1","P2","P3")
,因此我将尝试说明您的程序的执行顺序以更清楚;
- n = 4,执行else语句,else语句的第一行代码为
Towers(4 -1,fr,spare,to)
,递归树增加一个新的函数执行 - n = 3,执行else语句,else语句的第一行代码为
Towers(3 -1,fr,spare,to)
,在递归树中增加一个新的函数执行 - n = 2,执行else语句,else语句的第一行代码为
Towers(2 -1,fr,spare,to)
,递归树增加一个新的函数执行 - n = 1,如果语句被执行,被执行
printmove(fr,to)
,递归被中断。 - 树上所有先前的递归函数执行都按倒序死亡(最后添加到递归树 -> 第一次死亡)。
- 现在,唯一有效的函数执行是我们的第一次调用,
Towers(4,"P1","P2","P3")
因为n = 4 - 程序流程继续下一行代码,即
Towers(1,fr,to,spare)
- 它继续在该逻辑中流动,直到最后一个递归函数调用终止。
因此,如果该代码中没有if-else逻辑,则递归Towers(n-1,fr,spare,to)
将永远不会中断并开始无限递归。
推荐阅读
- reactjs - ReatcJS:在 IE11 中使用 VX 库?
- google-tag-manager - 如何防止所有标签在某些页面上触发?
- reporting-services - SSRS 仅在参数的特定值中使用文本字段
- angular - Angular 6 - 两个路由器插座
- node.js - if/else 块中的车把相等性检查
- python - Tensorflow Serving:get_model_status 缺少“utils”
- javascript - JS中的函数原型?
- laravel - Laravel 5.5:登录后如何停止重定向到上一页
- typescript - 在 Visual Studio Code 中显示未使用的 Typescript 变量
- php - 无法使用 php 在 facebook sdk 5 登录中获取访问令牌?