了解河内塔的递归解决方案

时间:2013-08-28 13:16:11

标签: c recursion towers-of-hanoi

有人可以解释一下这个程序吗?我特别想知道参数如何传递给函数tower以及递归如何工作。

以下是代码:

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

void main()
{
  int n;
  clrscr();
  printf("Enter the no. of disks");
  scanf("%d",&n);
  tower(n,'S','D','T');
  getch();
}

tower(int n,char SOURCE,char DEST,char TEMP)
{
  if(n>0)
  {
    tower(n-1,SOURCE,TEMP,DEST);
    printf("\nMove disk %d from %c to %c",n,SOURCE,DEST);
    tower(n-1,TEMP,DEST,SOURCE);
  }
  return;
}

2 个答案:

答案 0 :(得分:4)

嗯,最好的解释方法是首先解释一下你在现实生活中的表现:移动N个磁盘,

  • 首先将N-1个磁盘移动到中间位置,
  • 然后将底部磁盘移动到目的地
  • 最后,将N-1个磁盘从中间位置移动到目的地。

代码模仿了这一点。唯一要理解的是,源塔,目的地和临时的“角色”对于子塔而言是不同的。

  • 当我说“将N-1从源移动到临时”时,它表示source2 = sourcedest2 = temp,因此temp2 = dest
  • 移动底部磁盘时,所有内容都保持不变(source3 = sourcedest3 = desttemp3 = temp
  • 当我说“将N-1从temp移至dest”时,它意味着source4 = tempdest4 = dest,因此temp4 = source

答案 1 :(得分:2)

该计划说明了河内塔问题的解决方案。

所以你有1个堆有n个磁盘和2个其他空堆2和3.你需要将n个磁盘从堆1移动到堆3(或1到2,这没关系)。

如果您将n个磁盘设想为(n-1个磁盘)和1个磁盘,问题就变得很简单:将(n-1)移动到堆2,将最后一个磁盘移动到堆3。

所以现在你需要弄清楚如何将(n-1)个磁盘从堆1移动到堆2,这意味着你有n-1个磁盘的确切问题。重复这个过程,最终你只需要将1个磁盘从堆1移动到堆2。