2013-09-23 38 views
2
void TOH(int n,char x,char y,char z); 
void main() 
{ 
    int n; 
    printf("nEnter number of plates:"); 
    scanf("%d",&n); 
    TOH(n,'A','B','C'); 
    getch(); 
} 

void TOH(int n,char x,char y,char z) 
{ 
    if(n>0) 
    { 
    TOH(n-1,x,z,y); 
    printf("n%c -> %c",x,y); 
    TOH(n-1,z,y,x); 
    } 
} 

的在这个编码我是用递归调用,以及如何将人物和 整数的函数调用进行处理,任何人都可以用一个简单的演示说明很困惑。不清楚这个汉诺塔递归调用

+1

重命名你瓦尔更好的东西,并试图搞清楚:N = number_of_plates,X = first_tower,Y = second_tower,Z = third_tower。 – RedX

+0

也 - 不应该主要的呼叫是'TOH(n,'A','B','C');'? –

+0

@ItayKaro编辑! thinx – Dineshdk

回答

5

一般而言 - 解决河内问题的塔用正板应该:

  1. 移动n-1个从A到C
  2. 板移动单平板上A到B
  3. 移动n-1个选自C板到B

#1是同样的问题,而不是N平板n-1个时的塔是有序的A,C,B
#3也是同样的问题与n-1个代替了n后的塔是有序的A,B,A

例如板:
n = 3
1.移动2从A板至C
2.移动A上的单个板到B
3。选自C移动板2到B

#1被映射到呼叫TOH(n-1,x,z,y);
#2被映射到呼叫printf("n%c -> %c",x,y);
#3被映射到呼叫TOH(n-1,z,y,x);

编辑 - 例如
因此,这将是调用顺序(缩进是递归调用)

  • TOH(3, 'A', 'B', 'C')//从A移动板3到B
    • TOH(2, 'A', 'C', 'B')//从A移动板2至C
      • TOH(1, 'A',“B ','C')//将一个印版从A移动到B
      • 将一个印版从A移动到C
      • TOH(1, 'B', 'C', 'A')//从乙移动一个板到C
      • //现在我们有了在A 1块板用C
    • 2个板
    • 从A移动一个板到B
    • TOH(2, 'C', 'B', 'A')//选自C 2个移动板到B
      • TOH(1, 'C',“A ','B')//将一个板从C移动到A
      • 将一个板从C移动到B
      • TOH(1,'A','B','C')// move the last plate从A到B
      • DONE - 所有的板块都处于PLACE
+0

@italy karo几乎我知道他们是如何工作的,但无法得到如何在这个函数调用 – Dineshdk

+0

通过值为例如。在这种情况下,通过n = 3 TOH(2,x,z,y)进行两次递归调用。这部分是对于我的困惑。可以详细说明这个之间的thnx为例如 – Dineshdk

+0

增加了一个例子 - 希望它帮助 –