1. 程式人生 > >遞歸之漢諾塔

遞歸之漢諾塔

pos class 輸入 能力 else print adding -c 必須

遞歸的定義:

一個函數自己直接或間接調用自己(一個函數調用另外

一個函數和他調用自己是一模一樣的,都是那三步,

只不過在人看來有點詭異。)

遞歸滿足的三個條件:

1、遞歸必須得有一個明確的終止條件

2、該函數處理的數據規模必須在遞減

3、這個轉化必須是可解的。

循環和遞歸:

理論上循環能解決的,肯定可以轉化為遞歸,但是這個

過程是復雜的數學轉化過程,遞歸能解決不一定能轉化

為循環,我們初學者只要把經典的遞歸算法看懂就行,

至於有沒有能力運用看個人。

遞歸:

易於理解

速度慢

存儲空間大

循環

不易於理解

速度快

存儲空間小

漢諾塔代碼:

/*漢諾塔
如果n為1
    把A上面的直接移動到C
否則
    把A上面(n-1)通過C移動到B;
    把A第n個移動到C上;
    再把B上面(n-1)的通過A移動到C上; 
*/ #include<stdio.h> int i = 0; void hannuota(int n,char A,char B,char C) { if(1 == n) printf("%d...把%c最上面的移動到%c\n\n",++i,A,C); else { hannuota(n-1,A,C,B); printf("%d...把%c最上面的移動到%c\n\n",++i,A,C); hannuota(n-1,B,A,C); } } int main() { int
n; printf("請輸入盤子的數量:"); scanf("%d",&n); char ch1 = A,ch2 = B,ch3 = C; hannuota(n,ch1,ch2,ch3); printf("OVER............................\n"); }

把大的數據規模一層一層化小.重要的是思想,代碼很簡單.

遞歸之漢諾塔