遞迴是一種數學上分而治之的思想:
將原問題分解為規模較小的問題進行處理;
分解後的問題與原問題的型別完全相同,但規模較小
通過小規模問題的分解,能夠輕易求得原問題的解
問題的分解是有限的(遞迴不能無限進行)
當邊界條件不滿足時,分解問題(遞迴繼續進行)
當邊界條件滿足時,直接求解(遞迴結束)
遞迴在程式設計中的應用:
遞迴函式:
函式體中存在自我呼叫的函式;——問題的分解
遞迴函式必須有遞迴出口(邊界條件);
函式的無限遞迴將導致程式崩潰。
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
遞迴是一種數學上分而自治的思想 將原問題分解為規模較小的問題進行處理。分解後的問題與原問題的型別完全相同,但規模較小。通過小規模問題的求解,能夠輕易求得原問題的解。問題的分解是有限的 遞迴不能無限進行 當邊界條件不滿足時,分解問題 遞迴繼續進行 當邊界條件滿足時,直接求解 遞迴結束 地規模型的一般表...