我們不斷做著把事情翻譯成語言的工作!
漢諾塔老生常談的問題!
個人體會:一、理解函數意義和數據意義!
二、想象力,就像把一棵二叉樹先展開,再收攏!
直接上代碼(注釋以前寫的):
#include<stdio.h>
int count1,count;//count1,表示第一個圓盤移動的次數
//count,表示總的移動次數


/**//*函數功能:限制移動過程
函數參數: 整形變量num,表示第n個盤子
自發性變量 from,表示源木樁
字符型變量to,表示目的木樁
*/

void move(int num,char from,char to)


{
printf("move %d:from %c to %c\n",num,from,to);
count++;
}


/**//*函數功能:將第n個盤子從源木樁A,借助于木樁C移動到木樁B
函數參數:n,表示第n個盤子
a,表示源木樁a
b,表示目的木樁b
c,表示過度木樁c*/


/**//*我自己想法:
三個木樁,從第n個盤開始移動,只有當其他的盤都在c木樁才能移動n,
同理要將第n-1個盤從c移動到b,要將n-2個盤全部移動到a木樁
*/



void hanoi(int n,char a,char b,char c)


{
if(n==1) //遞歸出口:為什么是n==1?

{
move(n,a,b); //第n個盤子由a->b
count1++;
}
else

{
hanoi(n-1,a,c,b); //將第n-1個盤子,借助于b由a->c
move(n,a,b); //第n個盤子有a->b
hanoi(n-1,c,b,a); //將第n-1個盤子,借助于a有c->b
}
}


int main()


{
int n;
while(n!=0)

{
scanf("%d",&n);
hanoi(n,'A','B','C');
printf("count=%d\n",count);
printf("count1=%d\n",count1);
}
return 0;
}



/**//*通過程序運行,我們還可以得到:
當n為偶數時,第一個盤第一次移動移動到c,
當n為奇數時,第一個盤第一次移動到移動到b*/
運行結果:
posted on 2010-09-07 21:56
jince 閱讀(228)
評論(0) 編輯 收藏 引用 所屬分類:
算法設計與分析