Ханойская башня-JavaScript-хорошие части [дубликат]

этот вопрос уже есть ответ здесь:

Я видел другие вопросы о so о рекурсивной функции, и я прочитал ответы, но я все еще не могу заставить алгоритм щелкнуть в моей голове

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');

Как документ.писать.(..), либо. Моя логика-это первый раз, когда мы запускаем функциональный диск > 3. затем мы рекурсивно вызываем функцию снова, пропуская все ниже, так как этот документ.написать получить шанс бежать?

Я понимаю рекурсию (сделал основные примеры), но я все еще не вижу, как вы получаете результат. Если есть способ запустить его визуально и увидеть его в действии, это очень поможет.

1 ответов


вы можете думать о том, что произойдет, как дерево вызовов (время движется сверху вниз):

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]