递归算法小结(数的阶乘、斐波那契和汉诺塔问题)
? 遞歸是一項重要的編程技術,它讓函數可以從函數體內部調用自身。遞歸通常把一個大型復雜的問題層層簡化為一個,與原問題相似的規模較小的問題來求解,使用遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,這樣就大大地減少了程序的代碼量。但是使用遞歸的時候需要消耗較多的棧空間,所以遞歸次數過多容易造成棧溢出等。在堆棧尺寸受到限制的時候 ,一般需要避免使用遞歸。
1.什么是遞歸 ? 遞歸指的是函數在定義中直接或間接使用函數自身的方法。因此遞歸可分為直接遞歸和間接遞歸: ?(1)直接遞歸:遞歸函數直接調用該函數本身。 ?(2)間接遞歸:一個遞歸函數調用另一個遞歸函數,再從另一個遞歸函數調用回原來的遞歸函數。???2.遞歸的條件 ?(1)可以反復執行的遞歸過程。 ?(2)有一個跳出遞歸過程的條件,也就是不能無限遞歸。
3.遞歸應用1--數的階乘
用遞歸實現一個給定數的階乘。
遞歸C語言實現: #include <stdio.h>double factorial(unsigned int i);int main(){unsigned int i = 5;printf("%d 的階乘為 %lf\n", i, factorial(i));return 0; }double factorial(unsigned int i){if(i <= 1){return 1;}return i * factorial(i - 1); }運行結果:
3.遞歸應用2--斐波那契數列 ? 定義:一個數列的第0項是0,第1項是1,數列后的其他項是前兩項數值之和。 含10個元素的斐波那契數列為:0,1,1,2,3,5,8,13,21,34 遞歸C語言實現: #include <stdio.h>int fibonaci(int i);int main(){int i;for(i = 0; i < 10; i++){printf("%d\t\n", fibonaci(i));}return 0; }int fibonaci(int i){if(i == 0){return 0;}if(i == 1){return 1;}return fibonaci(i - 1) + fibonaci(i - 2); } 運行結果:4.遞歸應用3——漢諾塔問題(遞歸應用經典問題,能明白漢諾塔問題,遞歸就算理解了) 來源(百度百科):漢諾塔(又稱河內塔)問題是源于印度的一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。? 從上易知漢諾塔問題需遵循三個規則: ?(1)同一根柱子上從下到上圓盤的直徑依次減小。 ?(2)每一次只能移動一個圓盤。 ?(3)每次移動只能從最上面的圓盤移動。
解:(1)n == 1
?????? 第1次? 1號盤? A---->C????? sum = 1 次
? ? ? ? ?? (2) n == 2
?????? 第1次? 1號盤? A---->B
?????? 第2次? 2號盤? A---->C
?????? 第3次? 1號盤? B---->C??????? sum = 3 次
? (3)n == 3
第1次? 1號盤? A---->C
第2次? 2號盤? A---->B
第3次? 1號盤? C---->B
第4次? 3號盤? A---->C
第5次? 1號盤? B---->A
第6次? 2號盤? B---->C
第7次? 1號盤? A---->C??????? sum = 7 次 不難發現規律:1個圓盤的次數 2的1次方減1
2個圓盤的次數 2的2次方減1
? ? ? ? ? ? ? 3個圓盤的次數 2的3次方減1
? ? ? ? ? ? ? ? ? ?? 。? 。?? 。??? 。?? 。 ? 。
?n個圓盤的次數 2的n次方減1 故:移動次數為:2^n - 1 遞歸C語言實現: #include <stdio.h>void Move(char x, char y){printf("%c -> %c\n", x, y); }void Hanoi(int n, char one, char two, char three){if(1 == n){Move(one, three);}else{Hanoi(n - 1, one, three, two);Move(one, three);Hanoi(n - 1, two, one, three);} }int main(){void Hanoi(int n, char one, char two, char three);int m;printf("input the number of disks:");scanf("%d", &m);printf("The step to move %d diskes:\n", m);Hanoi(m, 'A', 'B', 'C'); } 運行結果:
總結
以上是生活随笔為你收集整理的递归算法小结(数的阶乘、斐波那契和汉诺塔问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker 之 Dockerfile
- 下一篇: 接地线标准接法(接地线标准)