標籤:遞迴 c語言 迭代 記憶體
在C語言中,所有的執行語句都只能出現在函數之中。同樣,函數的調用也只能出現在某函數的函數體內。函數的調用以兩種方式出現:函數的嵌套與函數的遞迴。 C語言中,所有函數的定義都是互相平行和獨立的,一個函數的定義不能包含另一個函數的定義,即不允許函數的嵌套定義。但函數的調用可以通過用一個函數另一個函數來實現,這就形成了函數的嵌套定義!C語言不限制嵌套的個數和層數,這樣我們就可以自由,合理的組織程式的模組結構
程式調用自身的編程技巧稱為遞迴( recursion)。
一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的代碼量。遞迴的能力在於用有限的語句來定義對象的無限集合。一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。
注意:
(1) 遞迴就是在過程或函數裡調用自身;
(2) 在使用遞迴策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口
(3)遞迴過程中必須要有逼近條件;
1fibonacci數列問題
#include<stdio.h> static long fibonacci(int n) //內建函式 { if(n==1||n==2) return 1; else { return fibonacci(n-2)+fibonacci(n-1); } } void main() { int n,i; printf("Input n."); scanf("%d",&n); for(i=1;i<=n;++i)/*列出每一項的值*/ { printf("%ld",fibonacci(i)); } }
遞迴方式按位輸出一個整數
#include<stdio.h>void print(int n){if (n != 0){print(n / 10);printf("%d", n % 10);}}int main(){int a = 12345;print(a);printf("\n");return 0;}
但值得注意的是 遞迴在調用過程中伴隨著壓棧等操作 過多次的遞迴不想看起來代碼量減少變簡單,而是更加複雜了 通常在return階段執行的遞迴操作被稱為 偽遞迴 ,
偽遞迴可以用迭代方式進行替換 大大減少了記憶體的壓力
fibonacci數列問題的非遞迴實現
int _fib(int n){int n1 = 1;int n2 = 1;int n3 = 0;if(n <= 2)return 1;elsewhile(n>2){n3 = n1 + n2;n1 = n2;n2 = n3;n--;}return n3;}
C中的遞迴問題