递归 汉诺塔移动问题

153 阅读1分钟

题目

有三根圆柱,最左边的圆柱上放了n层汉诺塔,即从下到上每一层都比上面大,打印n层汉诺塔,从左边移动到最右边的移动过程,要求每一层在移动过程中,不能放在比它自身小的那一层上,并且每次只能移动一层,最后要求得到原样的汉诺塔

  • 假设移动起始圆柱为from,目标圆柱为to,剩余的圆柱为other
  • 当只有一层时,直接打印移动即可
  • 当有两层时,需要先将第一层移动到other圆柱上,然后将第二层移动到to上,接着将other上的移动到to上
  • 当有三层时,要移动第三层,那么需要先移动前两层,而前两层的移动步骤如上,移动完成后,第三层移动到指定圆柱to,然后将前两层other移动到目标圆柱to
  • 当有n层时,需要先移动n-1层从from到other,然后将第n层从from到to,接着将n-1层从other移动到to
  • 故递归的结构将按照如上逻辑展开
function luo(n) {
  function move(i, start, to, other) {
    if (i < 1) {
      return;
    }
    move(i - 1, start, other, to);
    console.log(start + "=>" + to);
    move(i - 1, other, to, start);
  }
  move(n, "左", "右", "中");
}

luo(3);