汉诺塔(经典递归)(未完全明白)
作为经典递归的汉诺塔算法题, 迄今为止这是第二次被虐的,然而更惨的是还是没有虐明白,当然比第一次要理解的略深一点,这是唯一可以欣慰的,分析如下:
递归这种东西,不能深钻,很容易被各种逻辑搞混,所以要用一种大局观去解决问题,基本上整个汉诺塔分为四部分:
1.把A上的n-1个通过C移动到B上
2.把A上的最后一个移动到C上
3.把B上的n-1个通过C移动到A上
4.把B上的最后一个移动到C
1 #include "stdafx.h" 2 #include <stdlib.h> 3 int i = 0; 4 void Print(int n,char a,char b,char c) 5 { 6 //相当于1.3步骤 7 if(n == 1) 8 { 9 i++; 10 //虽然是执行2个步骤的输出,但是因为递归的输入已经包含了字符的变换,所以一行即可表示(程序的魅力啊!) 11 printf("这是第%d步,从%c->%c\n",i,a,c); 12 } 13 // 14 else 15 { 16 //每次递归传参,b、c调换位置 17 Print(n - 1,a,c,b); 18 i++; 19 //同上,但是还是没有理解为什么这个输在在这步而不是在下面那个递归的后面 20 printf("这是第%d步,从%c->%c\n",i,a,c); 21 //每次传参a,b调换位置 22 Print(n - 1,b,a,c); 23 } 24 25 } 26 int _tmain(int argc, _TCHAR* argv[]) 27 { 28 int n; 29 printf("请输入盘子数:"); 30 scanf("%d",&n); 31 Print(n,'A','B','C'); 32 system("Pause"); 33 return 0; 34 }
作为一个小白,真是被虐惨了...等过几天再被虐一次看看行不行!!