遞迴中的遞推與迴歸以及返回值和函式儲存的問題(以階乘問題進行討論)
一.遞推和迴歸:
引進階乘的問題,方便討論:
我們可以對階乘給出如下定義:n! = 1 * 2 * 3 * ...... * n; 0! = 1;(n!表示n的階乘)
當然,也可以以遞迴的方式給出定義:0!=1,n!=(n-1)!×n。
#include<iostream>
using namespace std;
int factorial(int a) {
return a == 0 ? 1 : a * factorial(a - 1);
}
int main() {
int a;
cin >> a;
a = factorial(a);
cout << a;
system("pause");
return 0;
}
遞迴函式本身就是根據給定規則,遞推並回歸的過程。題目中的遞推與迴歸的過程如下所示:
- 遞推:由未知推出已知(0! = 1):n! = n*(n-1)! -> (n-1)! = (n-1)*(n-2)! -> ... -> 0! = 1;
- 迴歸:利用遞推的已知條件推出未知(n!):0! = 1 -> ... -> n!;
二.有關遞迴函式的返回值問題:
- 首先從遞推開始,當遞迴函式遞推到最後一個函式,就將它的返回值作為函式呼叫者(倒數第二個函式)的部分運算條件參與運算。
- 正如此題所示,當遞推到a的階乘為0,就是此題遞迴函式的出口;
- 而後,將a等於0作為遞迴函式“迴歸”的開始條件。return 1給他的呼叫者來進行運算,重複此操作a次,直到將n!求出並返回給呼叫者main()並結束遞迴函式。
三.遞迴函式儲存問題:
- 在遞迴過程中,未被執行完畢的函式儲存在呼叫棧中,“迴歸”時再從棧中取出未執行完畢的函式,正如以上所述。
- 所以,棧“先進後出”的特點正滿足遞迴函式的呼叫所需。函式的儲存,也正是使用棧結構來實現的。
相關文章
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 樹遞迴問題的求解遞迴
- Python 函式進階-遞迴函式Python函式遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 遞迴路徑問題遞迴
- 遞迴的列印和階乘運用遞迴
- 函式的遞迴函式遞迴
- C#中漢諾塔問題的遞迴解法C#遞迴
- SQL with as 的用法 以及遞迴函式的寫法 遞迴層次查詢SQL遞迴函式
- 函式遞迴與生成式函式遞迴
- 遞迴函式遞迴函式
- 遞迴解決全排列問題遞迴
- 遞迴實現漢諾塔問題遞迴
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- 遞迴函式的理解遞迴函式
- 爬臺階問題(遞迴和動態規劃實現)遞迴動態規劃
- 以Top-Down思維去解決問題——遞迴遞迴
- 測開之函式進階· 第1篇《遞迴函式》函式遞迴
- 遞迴和遞推總結遞迴
- JavaScript 中匿名函式的遞迴呼叫JavaScript函式遞迴
- c#遞迴實現 階乘C#遞迴
- 遞迴思想----解決飲料問題遞迴
- Josephus問題解決方法五(遞迴)遞迴
- JavaScript 函式遞迴JavaScript函式遞迴
- php遞迴函式PHP遞迴函式
- 函式之遞迴函式遞迴
- 函式表示式–遞迴函式遞迴
- ACM(遞迴遞推—A)ACM遞迴
- 遞迴和尾遞迴遞迴
- 遞迴演算法程式設計整數因子分解問題的遞迴演算法遞迴演算法程式設計
- 機器學習:迴歸問題機器學習
- 請教一個切片遞迴賦值的問題遞迴賦值
- 初學 PHP 函式的遞迴PHP函式遞迴
- ACM(遞迴遞推—I)ACM遞迴
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- 第二章 :查詢與排序-------遞迴經典問題——漢諾塔問題排序遞迴