c 學習筆記 16 遞迴

2021-09-05 01:09:25 字數 3076 閱讀 1289

遞迴:能夠解決那些難以用簡單迴圈解決的問題

例如:八皇后問題,階乘

遞迴函式: 呼叫自身的函式

1.階乘:

0 !=1

1!=1

n!=n*(n-1)!

(n-1)!=(n-1)(n-2)!

假設函式factorial(n)為求n!;

如果呼叫到n=0的情況,函式直接返回結果,函式知道如何求解最簡單的情形,稱之為基本情況或者「停止條件」。如果引數大於0,函式將問題規約為求解(n-1)!的子問題。在遞迴中,子問題應該更簡單或者更小,但是子問題和原問題具有相同的性質,可以用乙個不同的引數呼叫本函式來求解子問題。這稱之為遞迴呼叫。

#include using namespace std;

int factorial(int);

int main(int argc, char *argv)

int factorial(int n)

函式遞迴呼叫的執行過程:

例如: 斐波那契額數列:

定義函式fib(n),求數列前n項

fib(0)=0;

fib(1) = 1;

fib(2) = fib(1)+fib(0)

fib(3) = fib(2)+fib(1)

#include using namespace std;

int fib(int);

int main(int argc, char *argv)

int fib(int n) // 求解斐波那契額數列

例如:fib(4)的呼叫過程。   呼叫棧的變化情況

利用遞迴判斷回文字串:

#include #include using namespace std;

bool ispalindrome(const string& s)

int main(int argc, char *argv)

給類似原問題的問題定義乙個遞迴函式.(這句話有點繞),得到原問題的求解方案,這種新的函式叫做遞迴輔助函式

對ispalindrome()函式的改進。

#include #include using namespace std;

// 為了避免每次遞迴都要建立新的字串,這裡傳入了引數low和high,指出上下界的範圍

// 過載ispalindrome()函式作為輔助函式

// 定義乙個輔助函式接受額外的引數

// 遞迴方案中有字串和陣列,遞迴輔助函式是非常有用的

bool ispalindrome(const string& s, int low, int high)

// 函式過載

bool ispalindrome(const string& s)

int main(int argc, char *argv)

遞迴的方法實現選擇排序,對字串進行排序:

#include #include using namespace std;

// 定義乙個輔助函式接受額外的引數

// 遞迴方案中有字串和陣列,遞迴輔助函式是非常有用的

void sort(string& s, int high) //遞迴輔助函式

} s[max_index] = s[high];

s[high] = max_char;

sort(s, high-1); // 遞迴呼叫

}} void sort(string& s)

int main(int argc, char *argv)

遞迴實現二分搜尋:

#include #include using namespace std;

// 定義乙個輔助函式接受額外的引數

// 遞迴方案中有字串和陣列,遞迴輔助函式是非常有用的

int binary_search(const int list, int key, int low, int high)

} int main(int argc, char *argv)

執行結果:

// 定義陣列queen[8]

// queen[i]=j 代表i行j列的皇后

const int number_of_queens = 8;

int queen[number_of_queens];

// 判斷解的合法性

bool isvalid(int row, int column)

return true;

} //

bool search(int row)

{ if(row==number_of_queens) //停止條件

return true;

for(int column=0; column遞迴有著嚴重的額外開銷,每當程式進行函式呼叫時,系統必須為所有的區域性變數和引數分配記憶體空間,需要消耗相當大的記憶體,可能造成棧溢位(stack overflow)的錯誤。

尾遞迴可以有效地減少堆疊空間。

注:(書本)

尾遞迴是可取的,因為當最後一次遞迴呼叫結束時,函式就結束了,所以沒有必要儲存在堆疊中的中間呼叫,有些編譯器可以優化尾遞迴來減少堆疊空間。

乙個非為尾遞迴的函式可以通過使用輔助引數轉換為乙個尾遞迴函式。

c 學習筆記 16

普通函式與函式模板的區別 普通函式呼叫時可以發生自動型別轉換 隱式型別轉換 函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換 如果利用顯示指定型別的方式,可以發生隱式型別轉換 int add1 int a,int b int a 10 char c a cout add1 a,c temp...

C 遞迴學習筆記

這篇筆記是對慕課上郭煒老師的c 課程自己的總結,方便日後複習 重點 將問題分解為規模更小的子問題解決 如 1.爬樓梯問題,乙個人每次走1級或2級,輸入樓梯級數求不同的走法數 n級台階走法 先走一級後,n 1級的台階走法 先走兩級後,n 2級台階走法f n f n 1 f n 2 完整 include...

python學習筆記16(遞迴 棧和佇列)

遞迴呼叫 乙個函式,呼叫了自身,稱為遞迴呼叫 遞迴函式 乙個會呼叫自身的函式稱為遞迴函式 特點 凡是迴圈能幹的事,遞迴都能幹 過程 1 寫出臨界條件 2 找這一次和上一次的關係 3 假設當前函式已經能用,呼叫自身計算上一次的結果,再求出本次的結果 輸入乙個數 大於等於1 求1 2 3 n的和 用fo...