刚开始学python,不是太能理解这道题的揭发,直接在网上查找的案例代码,后来退了半天终于搞清楚了,故存于此处以免以后遗忘
先上代码:
def move(n, a, b, c):
if(n == 1):
print(a,"->",c)
return
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
move(3, "a", "b", "c")
廖雪峰老师的题目是以三个盘为例,所以这里我也以三个盘作为n的参数进行推演。
move(3, "a", "b", "c") //首先是n=3时,不满足要求,跳到move(n-1, a, c, b)——>move(2,a,c,b)
move(2, "a","c","b") //然后n=2也不满足要求,跳到move(n-1, a, c, b)——>move(1,a,b,c)
move(1, "a", "b", "c") //此时n的值为1,满足if条件,执行print语句输出
print("a", "->", "c") //执行完后开始执行move(2,a,c,b)函数的第二第三句move语句 move(1, a, b, c)——>move(1,a,c,b) 和move(n-1, b, a, c)——>move(1,c,a,b)
move(1, "a", "c", "b") //此时n也为1,故执行print语句进行输出
print("a", "->", "b")
move(1, "c", "a", "b") //此时n仍然为1,继续执行print语句输出
print("c", "->", "b") //此时n=3循环中的move(n-1, a, c, b)循环才最终结束,开始执行move(1, a, b, c)——>move(1, a, b, c)
move(1, "a", "b", "c") //n=1,执行print语句输出
print("a", "->", "c") //现在开始执行move(3, a, b, c)递归的最后一个函数move(n-1, b, a, c)——>move(2, b, a, c)
move(2, "b", "a", "c") //n=2,故执行下三句函数,首先执行move(n-1, a, c, b)——>move(1, b, c, a)
move(1, "b", "c", "a") //n=1,执行print语句输出
print("b", "->", "a")
move(1, "b", "a", "c") //这里执行下三句函数的第二句move(1, a, b, c)——>move(1, b, a, c),由于n=1,执行print语句输出
print("b", "->", "c")
move(1, "a", "b", "c") //执行最后一个函数move(n-1, b, a, c)——>move(1, a, b, c)
print("a", "->", "c") //n=1,执行print语句输出,完成整个汉诺塔函数的输出