【问题标题】:Understanding recursive solution to Towers of Hanoi [duplicate]了解河内塔的递归解决方案[重复]
【发布时间】:2013-08-31 14:17:04
【问题描述】:

谁能解释一下这个程序?我特别想知道参数是如何传递给函数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;
}

【问题讨论】:

  • 如果它是缩进的可能会少很多混乱-_-
  • 递归不像递归那样令人困惑不像递归那样令人困惑......
  • 这是河内塔问题的规范递归解决方案:cs.cmu.edu/~cburch/survey/recurse/hanoiimpl.html
  • 递归,adj:见 recursive
  • @SubSevn 你打败了我,得到了完全相同的评论...... :)

标签: c recursion towers-of-hanoi


【解决方案1】:

这个程序说明了河内塔问题的解决方案。

所以你有一堆 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 堆。

【讨论】:

  • 我想补充一点:河内塔问题的递归解决方案的输出是一组关于如何解决现实生活中的问题的说明。在互联网上查找有关现实生活问题的视频,您就会明白我的意思。
【解决方案2】:

嗯,最好的解释方法是先解释你在现实生活中是如何做到的:移动 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2016-01-27
    • 2016-05-25
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多