遞迴和非遞迴

2021-09-18 01:58:47 字數 1838 閱讀 9542

1、遞迴就是函式呼叫函式本身,執行起來就是函式巢狀函式,層層巢狀,所以函式呼叫、引數堆疊都是不小的開銷,但是程式簡單。

2、非遞迴就是不斷地對引數入棧、出棧,省去了函式層層展開、層層呼叫的開銷。雖然引數出入棧次數多了,但是一般都開闢固定的足夠大的記憶體來一次性開闢、重複使用。

3、非遞迴是從堆疊的角度來編寫程式,速度快,但**複雜。

遞迴是從問題本身的邏輯角度來編寫,雖然速度相對慢,但**容易理解。

對於同乙個問題,如果對速度要求不高,建議用遞迴方式。

1.遞迴和非遞迴分別實現求第n個斐波那契數

首先對於斐波那契數序列:1 1 2 3 5 8 13 21 34… 從第三項開始,每一項都等於前兩項之和。

int count = 0;   //計數計算多少次f1

int fabonaci(int n) //遞迴

else }

int main()

int fabonaci(int n) //非遞迴

return f3;

}int main()

2.遞迴和非遞迴分別實現strlen

strlen遇到\0停止,引用陣列引進標頭檔案,字串的長度就是字元個數。

#includeint count = 0;

int mystrlen1(char *str) //非遞迴

return count;

}int main()

int mystrlen(char *str)  //遞迴

else }

int main()

3.遞迴和非遞迴分別實現求n的階乘

int fac(int n)//5! = 5*4!   5*4*3!

else }

int main()

4.遞迴實現n^k

int mypow(int n, int k)  //遞迴

else }

int main()

5.遞迴方式實現列印乙個整數的每一位

void print(int n)   //123   

printf("%d ", n % 10);

}int main()

6寫乙個遞迴函式digitsum(n),輸入乙個非負整數,返回組成它的數字之和

int digitsum(int n)

else//14 123 }

int main()

遞迴的過程是***先遞後歸*** 1729 172 17 1為遞過程 ; 1 7 2 9為歸過程

7.編寫乙個函式 reverse_string(char * string)(遞迴實現)

void reverse_string(char *p) //遞迴

*(p + len - 1) = tmp; // *p 和 *(p+len-1) 進行交換

}int main()

void reverse_string(char *str) //非遞迴

}int main()

遞迴 非遞迴

遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如 hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此 在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問題 另外,有些程式語言不支援...

堆排序遞迴和非遞迴

完全二叉樹 葉子節點在最後一層或者次一層,且節點從左往右連續 大根堆 任何根節點都比他的左右子節點都要大 i為節點在陣列中的索引,求節點的父節點 i 1 2,求節點的左節點 i 2 1,求節點的右節點 i 2 2 測試方法 test public void test heapify2 array s...

遞迴轉非遞迴

題目描述 給定乙個列表,該列表中的每個要素要麼是個列表,要麼是整數。將其變成乙個只包含整數的簡單列表。如果給定的列表中的要素本身也是乙個列表,那麼它也可以包含列表。您在真實的面試中是否遇到過這個題?樣例給定 1,2,1,2 返回 1,2,1,2 給定 4,3,2,1 返回 4,3,2,1 挑戰請用非...