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

时间:2013-09-23 10:04:55

标签: c algorithm function recursion

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);
  }
}

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

1 个答案:

答案 0 :(得分:5)

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

  1. 将n-1板从A移至C
  2. 将A板上的单板移至B
  3. 将n-1板从C移至B
  4. 当塔被命令为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')//从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
        • 完成 - 所有楼层都在位置
相关问题