我已经看过关于递归函数的其他问题,我已经阅读了回复,但我仍然无法让算法点击我的脑袋
var hanoi = function (disc, src, aux, dst) {
if (disc > 0) {
hanoi(disc - 1, src, dst, aux);
document.write('Move disc ' + disc + ' from ' + src + ' to ' + dst);
hanoi(disc - 1, aux, src, dst);
}
}
hanoi(3, 'Src', 'Aux', 'Dst');
document.write(...)如何运行。我的逻辑是我们第一次运行功能光盘是> 3.然后我们递归调用函数再次跳过下面的所有内容,那么document.write如何有机会运行?
我理解递归(完成了基本的例子),但我仍然无法看到你如何获得输出。如果有一种方法,我可以直观地运行它并看到它在行动,这将有所帮助。
答案 0 :(得分:22)
你可以想到作为一个调用树会发生什么(时间从上到下):
hanoi(3, ...) =>
|-> hanoi(2, ...) =>
| |-> hanoi(1, ...) =>
| | |-> hanoi(0, ...) =>
| | | \-> (does nothing)
| | |-> document.write(...)
| | |-> hanoi(0, ...) =>
| | | \-> (does nothing)
| | <-/ [hanoi(1, ...) finished]
| |-> document.write(...)
| |-> hanoi(1, ...) =>
| | |-> hanoi(0, ...) =>
| | | \-> (does nothing)
| | |-> document.write(...)
| | |-> hanoi(0, ...) =>
| | | \-> (does nothing)
| | <-/ [hanoi(1, ...) finished]
| <-/ [hanoi(2, ...) finished]
|-> document.write(...) [halfway done!]
|-> hanoi(2, ...) =>
| \-> [same pattern as the first time, with different data]
\-> [hanoi(3, ...) finished]