对于标准答案的递归很多人都看不懂,其实就是一个深度优先的遍历。我写了段伪代码,将递归步骤还原并注释了一下,供大家参考,希望大家有所收获。
#if条件不成立的省略
# { 看做递归开始
# } 看做递归结束
move(4, a, b, c):{ #实际数值(4, A, B, C)
move(3, a, c, b):{ #c,b调换,实际数值(3, A, C, B), 将这四个值带入move(3, a, b, c)递归1
move(2, a, c, b):{ #c,b调换,实际数值(2, A, B, C), 将这四个值带入move(2, a, b, c)递归2
move(1, a, c, b):{ #c,b调换,实际数值(1, A, C, B), 将这四个值带入move(1, a, b, c)递归3
if n == 1: #此时n==1,if条件成立
print(a, '-->',c) #这是第一次打印A-->B
} #最近的一次递归3完成,回到递归2,实际数值(2, A, B, C)
print(a, '-->', c) #这是第二次打印A-->C
move(1, b, a, c):{ #a,b调换,实际数值(1, B, A, C), 将这四个值带入move(1, a, b, c)递归4
if n == 1:
print(a, '-->', c)#这是第三次打印B-->C
} #最近的一次递归4完成,回到递归2,实际数值(2, A, B, C)
} #最近的一次递归2完成,回到递归1,实际数值(3, A, C, B)
print(a, '-->', c) #这是第四次打印A-->B
move(2, b, a, c):{ #a,b调换, 实际数值(2, C, A, B), 将这四个值带入move(2, a, b, c)递归5
move(1, a, c, b):{ #c,b调换, 实际数值(1, C, B, A), 将这四个值带入move(1, a, b, c)递归6
if n == 1:
print(a, '-->', c)#这是第五次打印C-->A
} #最近的一次递归6完成,回到递归5,实际数值(2, C, A, B)
print(a, '-->', c) #这是第六次打印C-->B
move(1, b, a, c):{ #a,b调换, 实际数值(1, A, C, B), 将这四个值带入move(1, a, b, c)递归7
if n == 1:
print(a, '-->', c)#这是第七次打印A-->B
} #最近的一次递归7完成,回到递归5,实际数值(2, C, A, B)
} #最近的一次递归5完成,回到递归1,实际数值(3, A, C, B)
} #最近的一次递归1完成,原参数中的move(n - 1, a, c, b)递归全部完成,实际数值(4, A, B, C)
print(a, '-->', c) #这是第八次打印A-->C,下面跟上面同样的方式去理解,就不写了,太累了。
move(3, b, a, c):{
move(2, a, c, b):{
move(1, a, c, b):{
if n == 1:
print(a, '-->', c) #这是第九次打印
}
print(a, '-->', c)#这是第10次打印
move(1, b, a, c):{
if n == 1:
print(a, '-->', c)#这是第11次打印
}
}
print(a, '-->', c) #这是第12次打印
move(2, b, a, c):{
move(1, a, c, b):{
if n == 1:
print(a, '-->', c) #这是第13次打印
}
print(a, '-->', c)#这是第14次打印
move(1, b, a, c):{
if n == 1:
print(a, '-->', c)#这是第15次打印
}
}
}
}