遞迴中的遞推與迴歸以及返回值和函式儲存的問題(以階乘問題進行討論)

Hello_MyDream發表於2018-08-16

一.遞推和迴歸:

引進階乘的問題,方便討論:

我們可以對階乘給出如下定義: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;
}

遞迴函式本身就是根據給定規則,遞推並回歸的過程。題目中的遞推與迴歸的過程如下所示:

  1. 遞推:由未知推出已知(0! = 1):n! = n*(n-1)! -> (n-1)! = (n-1)*(n-2)! -> ... -> 0! = 1;
  2. 迴歸:利用遞推的已知條件推出未知(n!):0! = 1 -> ... -> n!;

 

二.有關遞迴函式的返回值問題:

 

  1. 首先從遞推開始,當遞迴函式遞推到最後一個函式,就將它的返回值作為函式呼叫者(倒數第二個函式)的部分運算條件參與運算。
  2. 正如此題所示,當遞推到a的階乘為0,就是此題遞迴函式的出口;
  3. 而後,將a等於0作為遞迴函式“迴歸”的開始條件。return 1給他的呼叫者來進行運算,重複此操作a次,直到將n!求出並返回給呼叫者main()並結束遞迴函式。

 

三.遞迴函式儲存問題:

  1. 在遞迴過程中,未被執行完畢的函式儲存在呼叫棧中,“迴歸”時再從棧中取出未執行完畢的函式,正如以上所述。
  2. 所以,棧“先進後出”的特點正滿足遞迴函式的呼叫所需。函式的儲存,也正是使用棧結構來實現的。

 

 

 

 

相關文章