相关疑难解决方法(0)

河内塔:递归算法

虽然我对理解递归没有任何问题,但我似乎无法绕过河内塔问题的递归解决方案.以下是维基百科的代码:

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)

我理解基本情况和将问题分解成小块的概念,直到您能够移动单个磁盘.但是,我无法弄清楚非基本情况下的两个递归调用是如何协同工作的.也许有人可以帮助我?谢谢.

recursion towers-of-hanoi

63
推荐指数
4
解决办法
16万
查看次数

河内塔 - JavaScript - 很好的部分

我已经看到关于递归函数的其他问题,我已经阅读了回复,但我仍然无法让算法点击我的脑袋

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如何有机会运行?

我理解递归(完成了基本的例子),但我仍然看不出你是如何获得输出的.如果有一种方法,我可以直观地运行它并看到它在行动,这将有所帮助.

javascript algorithm recursion

8
推荐指数
1
解决办法
3240
查看次数

Crockford的河内功能(来自"The Good Parts")

目前我正在阅读道格拉斯·克罗克福德(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 …

javascript recursion towers-of-hanoi

5
推荐指数
2
解决办法
2287
查看次数