虽然我对理解递归没有任何问题,但我似乎无法绕过河内塔问题的递归解决方案.以下是维基百科的代码:
procedure Hanoi(n: integer; source, dest, by: char);
Begin
if (n=1) then
writeln('Move the plate from ', source, ' to ', dest)
else begin
Hanoi(n-1, source, by, dest);
writeln('Move the plate from ', source, ' to ', dest);
Hanoi(n-1, by, dest, source);
end;
End;Run Code Online (Sandbox Code Playgroud)
我理解基本情况和将问题分解成小块的概念,直到您能够移动单个磁盘.但是,我无法弄清楚非基本情况下的两个递归调用是如何协同工作的.也许有人可以帮助我?谢谢.
我已经看到关于递归函数的其他问题,我已经阅读了回复,但我仍然无法让算法点击我的脑袋
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');
Run Code Online (Sandbox Code Playgroud)
document.write(...)是如何运行的.我的逻辑是我们第一次运行功能光盘> 3.然后我们递归调用该函数再次跳过下面的所有内容,那么document.write如何有机会运行?
我理解递归(完成了基本的例子),但我仍然看不出你是如何获得输出的.如果有一种方法,我可以直观地运行它并看到它在行动,这将有所帮助.
目前我正在阅读道格拉斯·克罗克福德(Douglas Crockford)的书,而且河内功能的塔楼有点过头了.即使将日志记录到控制台,我也无法真正了解正在发生的事情.这是我添加的功能:
var hanoi = function (disc, src, aux, dst) {
console.log(disc);
console.log(src, dst);
if (disc > 0) {
hanoi(disc - 1, src, dst, aux);
console.log('Move disc ' + disc + ' from ' + src + ' to ' + dst);
hanoi(disc - 1, aux, src, dst);
}
}
hanoi(3, 'Src', 'Aux', 'Dst');
Run Code Online (Sandbox Code Playgroud)
这导致以下结果:
3
Src Dst
2
Src Aux
1
Src Dst
0
Src Aux
将光盘1从Src移动到Dst
0
Aux Dst
将光盘2从Src移动到Aux
1
Dst Aux
0
Dst Src
将光盘1从Dst移动到Aux
0 …