不清楚这个河内递归召唤塔

use*_*r11 2 c algorithm recursion function

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Ita*_*aro 5

一般来说 - 要解决n个板块的河内问题你应该:

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

当塔被命令时,#1与n-1而不是n个板相同的问题A,C,B
#3与n-1相同而不是n个板时,当塔被命令为A,B,A时

例如:
对于n = 3
从A到C 1.将2板
2.将单平板上A到B
3.移动从C 2块板,以乙

#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')//从A到B移动3个板块
    • 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')//从C到B移动2个板块
      • TOH(1,'C','A','B')//将一个板从C移动到A.
      • 将一个盘子从C移动到B.
      • TOH(1,'A','B','C')//将最后一个板从A移动到B.
      • 完成 - 所有板块都在位