在河内塔移动光盘

时间:2010-10-08 06:19:35

标签: c recursion

请使用F7逐步向我解释递归过程。

我无法将回报与控制流量联系起来。

#include<stdio.h>
#include<conio.h>

void t_of_h(char, char, char, int);

void main()
{
    int n;
    clrscr();

    printf("Enter no of DISC in Tower of Hanoi : ");
    scanf("%d",&n);

    printf("\nTower of Hanoi using %d DISCS\n",n);

    t_of_h('X', 'Y', 'Z', n);
    getch();
}

void t_of_h(char p1, char p2, char p3, int n)
{
   if(n==0)
     printf("Unsuccessful move\n");
   if(n==1)
     printf("Move DISC from %c to %c\n",p1,p3);
   else
   {
      t_of_h(p1,p3,p2,n-1);
      t_of_h(p1,p2,p3,1);
      t_of_h(p2,p1,p3,n-1);
   }
}

2 个答案:

答案 0 :(得分:3)

如何将N盘从A座移到B座?

  1. 将N-1个磁盘从A塔移到C座。
  2. 将底部磁盘从A塔移至B座。
  3. 将N-1个磁盘从C塔移到B座。
  4. 代码是一个非常直接的实现。如果您认为可以将任意数量的磁盘从一个塔移动到另一个塔,那么这显然可行。如何将N-1盘从A塔移到C座?好吧,你把N-2盘从A座移到B座,然后将第N-1盘从A座移到C座,然后将N-2盘从B座移到C座。然后重复...

    最终,递归停止,因为您有一个要移动的磁盘。

    一个有趣的练习是“编写测试工具,确保不会进行无效移动”。


    好的 - 我已经运行了代码。它对过程的可视化是可怕的。很难看出发生了什么。但它直接报告算法的作用。现在怎么样?

    1个磁盘

    Enter no of DISC in Tower of Hanoi : 1
    
    Tower of Hanoi using 1 DISCS
    Move DISC from X to Z
    

    2个磁盘

    Enter no of DISC in Tower of Hanoi : 2
    
    Tower of Hanoi using 2 DISCS
    Move DISC from X to Y
    Move DISC from X to Z
    Move DISC from Y to Z
    

    请注意,它正在将磁盘从X移动到Z.如何将2个磁盘从X移动到Z?将顶部磁盘从X移动到Y.将底部磁盘从X移动到Z.将原始顶部磁盘从Y移动到Z.

    3个磁盘

    Enter no of DISC in Tower of Hanoi : 3
    
    Tower of Hanoi using 3 DISCS
    Move DISC from X to Z
    Move DISC from X to Y
    Move DISC from Z to Y
    Move DISC from X to Z
    Move DISC from Y to X
    Move DISC from Y to Z
    Move DISC from X to Z
    

答案 1 :(得分:0)

使用F7?

如果您在理解递归时遇到困难,请拿出笔和纸并逐步完成该程序。使用正确的参数堆叠每个调用。

当你想象它时应该更简单。