4

有人可以解释一下这个程序吗?我特别想知道参数是如何传递给函数的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;
}
4

2 回答 2

4

嗯,最好的解释方法是先解释你在现实生活中是如何做到的:移动 N 个磁盘,

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

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

  • 当我说“将 N-1 从源移动到临时”时,它的意思是source2 = source, dest2 = temp,结果是temp2 = dest
  • 当你移动底部的磁盘时,一切都没有改变(source3 = source, dest3 = dest,temp3 = temp
  • 当我说“将 N-1 从 temp 移动到 dest”时,它的意思是source4 = temp, dest4 = dest,结果是temp4 = source
于 2013-08-28T13:30:27.800 回答
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。

于 2013-08-28T14:22:09.807 回答