问题描述

a b c 三个柱子,起初在 a 上有 n 个按大小关系顺序安放的盘子,需要全部移动到 c 上。
移动规则:在小圆盘上不能放大圆盘,在 a b c 三根柱子之间一次只能移动一个圆盘。

初始状态如下:

Untitled Diagram.drawio (5).png
图 1 : 初始状态

目标状态如下:

Untitled Diagram.drawio (6).png
图 2 : 目标状态

解决思路

Untitled Diagram.drawio (4).png
图 3 : 移动过程

代码实例

  1. #include <stdio.h>
  2. void message(int n, char from, char to) {
  3. printf("将 %d 号盘, 从 %c 移动到 %c\n", n, from, to);
  4. return;
  5. }
  6. void hanoi(int n, char a, char b, char c) {
  7. if (n == 1) {
  8. message(n, a, c);
  9. return;
  10. }
  11. hanoi(n - 1, a, c, b);
  12. message(n, a, c);
  13. hanoi(n - 1, b, a, c);
  14. return;
  15. }
  16. int main() {
  17. hanoi(3, 'a', 'b', 'c');
  18. return 0;
  19. }
  1. function message(n, from, to) {
  2. console.log(`将 ${n} 号盘, ${from} 移动到 ${to}`);
  3. }
  4. function hanoi(n, a, b, c) {
  5. if (n == 1) {
  6. message(n, a, c);
  7. return;
  8. }
  9. hanoi(n - 1, a, c, b);
  10. message(n, a, c);
  11. hanoi(n - 1, b, a, c);
  12. return;
  13. }
  14. hanoi(3, "a", "b", "c");