六 遞迴的思想與應用

2021-08-19 03:18:36 字數 2477 閱讀 4220

遞迴是一種數學上分而治之的思想:

將原問題分解為規模較小的問題進行處理;

分解後的問題與原問題的型別完全相同,但規模較小

通過小規模問題的分解,能夠輕易求得原問題的解

問題的分解是有限的(遞迴不能無限進行)

當邊界條件不滿足時,分解問題(遞迴繼續進行)

當邊界條件滿足時,直接求解(遞迴結束)

遞迴在程式設計中的應用:

遞迴函式:

函式體中存在自我呼叫的函式;——問題的分解

遞迴函式必須有遞迴出口(邊界條件);

函式的無限遞迴將導致程式崩潰。

unsigned int sum( unsigned int n)

else

}

unsigned  int fac(unsigned int n)

if( n == 2)

if( n == 1)

return 0;

}

unsigned int _strlen_(const char* s)

else */

//*************一行**實現***************************//

}

return s ? (*s ? (1 + _strlen_(s+1)):0):0;  //先判斷s是否為零,再判斷字元是否為 '\0'
遞迴的思想在於分而治之,首先建立遞迴的模型,模型中必須要有邊界條件,最好能先寫出遞迴函式的數學表達。

注意:不要陷入遞迴函式的執行細節,要學會通過**來描述遞迴問題。

先定義乙個鍊錶結點

struct node;
node* create_list(int v, int len)

else

}return ret;

}void destory_list(node* list)

}void print_list(node* list)

cout<< "null"轉置函式的實現:

node* reverse(node* list)

else

}

先找到出口條件:

函式呼叫過程的回顧:程式執行後有乙個特殊的記憶體區域供函式呼叫使用:比如全域性變數在全域性資料區,資料段;**放在**段。

這塊區域用於儲存函式中的實參,區域性變數、臨時變數等,從起始位址開始往乙個方向增長,(如高位址--->低位址),並且有乙個專用的「指標」標識當前已經使用記憶體的「頂部」。

特點:只在記憶體某塊區域的一端進行操作。

程式中的棧區:一段特殊的專用記憶體區(供函式呼叫)

回溯演算法的核心:g()函式呼叫結束之後,f()函式呼叫對應的棧空間的資料不會發生變化。

示例1:逆序列印單鏈表中的偶數結點

請讀者自行測試

遞迴的思想與應用

遞迴是一種數學上分而自治的思想,將原問題分解為規模較小的問題進行處理,分解後的問題與原問題的型別完全相同,但規模較小,通過小規模問題的解,能夠輕易求得原問題的解,但是問題的分解是有限的,當邊界條件滿足時,遞迴結束直接求解否則遞迴繼續進行,在程式設計中遞迴函式就是遞迴的體現,遞迴模型的一般表示法如下 ...

遞迴思想的原理與應用 Recursion

函式自己呼叫自己本身 method 或methoda methodb 將乙個複雜的問題分解成幾個相同的簡單問題 遞迴需要出口 在進行迴圈時,每當一次迴圈結束,迴圈的結果作為下次迴圈的初始值,而上次迴圈占用的記憶體就會被系統釋放。因此迴圈可以沒有出口而不停無限迴圈下去。而在進行遞迴時,程式是按層次進行...

43 遞迴的思想與應用1

遞迴是一種數學上分而自治的思想 將原問題分解為規模較小的問題進行處理。分解後的問題與原問題的型別完全相同,但規模較小。通過小規模問題的求解,能夠輕易求得原問題的解。問題的分解是有限的 遞迴不能無限進行 當邊界條件不滿足時,分解問題 遞迴繼續進行 當邊界條件滿足時,直接求解 遞迴結束 地規模型的一般表...