2
void TOH(int n,char x,char y,char z);
void main()
{
  int n;
  printf("nEnter number of plates:");
  scanf("%d",&n);
  TOH(n,'A','B','C');
  getch();
}

void TOH(int n,char x,char y,char z)
{
  if(n>0)
  {
    TOH(n-1,x,z,y);
    printf("n%c -> %c",x,y);
    TOH(n-1,z,y,x);
  }
}

在这个编码中,我对递归调用以及如何在函数调用中处理字符和整数感到困惑,任何人都可以通过简单的演示来解释。

4

1 回答 1

5

一般来说 - 要使用 n 个板解决河内塔问题,您应该:

  1. 将 n-1 个板从 A 移动到 C
  2. 将 A 上的单板移动到 B
  3. 将 n-1 个板从 C 移动到 B

#1 当塔的顺序是 A、C、B 时,
用 n-1 而不是 n 个板是同样的问题 #3 当塔的顺序是 A、B、A 时,用 n-1 而不是 n 板是同样的问题

例如:
对于n = 3
1. 将 2 个板从 A 移动到 C
2. 将 A 上的单个板移动到 B
3. 将 2 个板从 C 移动到 B

#1 映射到调用TOH(n-1,x,z,y);
#2 映射到调用printf("n%c -> %c",x,y);
#3 映射到调用TOH(n-1,z,y,x);

编辑-示例
所以这将是调用的顺序(缩进是递归调用)

  • TOH(3, 'A', 'B', 'C') // 将 3 个盘子从 A 移动到 B
    • TOH(2, 'A', 'C', 'B') // 将 2 个盘子从 A 移动到 C
      • TOH(1, 'A', 'B', 'C') // 将一个盘子从 A 移到 B
      • 将一个盘子从 A 移到 C
      • TOH(1, 'B', 'C', 'A') // 将一个盘子从 B 移到 C
      • // 现在我们在 A 中有 1 个盘子,在 C 中有 2 个盘子
    • 将一个盘子从 A 移到 B
    • TOH(2, 'C', 'B', 'A') // 将 2 个盘子从 C 移动到 B
      • TOH(1, 'C', 'A', 'B') // 将一个盘子从 C 移到 A
      • 将一个盘子从 C 移到 B
      • TOH(1, 'A', 'B', 'C') // 将最后一个盘子从 A 移动到 B
      • 完成 - 所有盘子都已就位
于 2013-09-23T10:16:00.673 回答