【问题标题】:unclear with this tower of hanoi recursive call不清楚这个河内塔递归调用
【发布时间】:2013-09-28 04:33:07
【问题描述】:
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);
  }
}

在这种编码中,我对递归调用以及字符和 整数是在函数调用中处理的,谁能用一个简单的演示来解释一下。

【问题讨论】:

  • 将您的 vars 重命名为更好的名称并尝试弄清楚:n = number_of_plates, x = first_tower, y = second_tower, z = third_tower。
  • 另外 - main 中的调用不应该是TOH(n,'A','B','C');吗?
  • @ItayKaro 已编辑!谢谢

标签: c algorithm function recursion


【解决方案1】:

通常 - 要解决 n 个板的河内塔问题,您应该:

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

当塔按 A、C、B 排序时,#1 与 n-1 而不是 n 个板的问题相同
当塔按 A、B、A 顺序排列时,#3 与 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
      • 完成 - 所有盘子都已就位

【讨论】:

  • @italy karo 实际上我知道它们是如何工作的,但无法知道值是如何在这个函数调用中传递的
  • 例如。在这种情况下,n=3 TOH(2,x,z,y) 被传递了两个递归调用。这部分是我的困惑。你可以在 thnx 之间为你的例子详细说明一下
  • 添加了一个示例 - 希望对您有所帮助
  • 对我帮助很大!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 2016-01-27
相关资源
最近更新 更多