注意:我了解递归解决方案;但我看不到代码是如何实现的,因为我无法按照代码执行的逐步进行。
我很难理解河内塔的递归循环。我已经评论并尝试了各种策略来查看程序是如何运行的,但我似乎无法掌握循环是如何运行的以及环是如何被引导的。
def move(rings, from, destination, other)
if rings == 1
ring = from.pop
p "Move ring #{ring} from #{from} to #{destination}"
destination.push ring
else
move(rings-1, from, other, destination)
move(1, from, destination, other)
move(rings-1, other, destination, from)
end
end
这是输出:
"Move ring 1 from a to c"
"Move ring 2 from a to b"
"Move ring 1 from c to b"
"Move ring 3 from a to c"
"Move ring 1 from b to a"
"Move ring 2 from b to c"
"Move ring 1 from a to c"
我查看了各种解释,但是,我没有看到解释循环是如何执行的。例如,我不明白为什么在环是偶数的情况下,第一步将环 1 从 a 放置到 b,而对于所有奇数环,它是从 a 到 c,如上所示。
我理解解决方案背后的逻辑,为了在使用辅助挂钩时将 n 个环移动到目的地,需要您首先将 n-1 个环移动到辅助挂钩,然后将第 n 个环移动到目的地并重复第一个程序,再次。但是,我不确定放置方向是如何变化的,例如,当上面对 move 方法的调用似乎没有提到 c 到 b 时,我看不到块是如何从 c 到 b 的。
提前感谢您的时间和帮助。
此外,如果您对帮助跟踪 Ruby 中的代码执行过程有任何建议,请告诉我。我很想听听您对如何解决不确定事情如何执行的实例的一些见解。
渴望听到你的答案:)