2013-08-28 191 views
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; 
} 
+8

如果它缩进,它可能会少得多 - 0 - –

+8

递归不是因为递归混淆不如混淆递归不如混淆...... – Aerovistae

+3

这是河内问题塔的典型递归解决方案:http://www.cs.cmu.edu/~cburch/survey /recurse/hanoiimpl.html – SubSevn

回答

2

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

所以,你必须桩1具有n个磁盘和2等空桩2和3,您需要从桩1移动n个磁盘桩3(或1到2,没关系)

如果你想象的n个磁盘为(n-1磁盘)和1盘,问题就变得简单:移动(N-1)堆2和最后一个磁盘堆3.

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

4

好了,解释的最好方法是说明您在现实生活中这样做是为了启动:要移动N个磁盘,

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

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

  • 当我说 “从源移动N-1至温度”,这意味着source2 = sourcedest2 = temp,并且作为结果temp2 = dest
  • 当您移动底部盘,一切都不变(source3 = sourcedest3 = desttemp3 = temp
  • 当我说 “从临时移动N-1至目的”,这意味着source4 = tempdest4 = dest,并因此temp4 = source