首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C++ 求階乘兩種經典實現:靜態局部變量累積法與遞歸法

     編輯:更多程式設計知識

方法一:靜態局部變量累積(迭代思想)

#include <iostream>
using namespace std;

int fac(int n) {
    static int f = 1; // 僅初始化一次,保留上次結果
    f *= n;
    return f;
}

int main() {
    for (int i = 1; i <= 5; i++)
        cout << i << "!=" << fac(i) << endl;
    return 0;
}
/* 輸出:
1!=1
2!=2
3!=6
4!=24
5!=120
*/

原理:利用 static 變量跨函數調用保持狀態,每次調用在上次結果基礎上乘以當前 n。注意:非線程安全,且再次調用需重置。

方法二:遞歸實現(數學定義)

#include <iostream>
using namespace std;

int fac(int n) {
    if (n < 0) return 0;
    if (n == 0 || n == 1) return 1;
    return n * fac(n - 1);
}

int main() {
    for (int i = 1; i <= 5; i++)
        cout << i << "!=" << fac(i) << endl;
    return 0;
}

優點:邏輯清晰,符合數學定義。缺點:棧深度 O(n),大 n 導致棧溢出。

對比與擴展

維度靜態累積遞歸
時間複雜度O(n) 總調用O(n) 單次調用
空間複雜度O(1)O(n) 棧
線程安全否是(無共享狀態)
適用場景連續求 1!~n!單次求值、教學演示

工程推薦:尾遞歸優化或迭代循環

// 迭代版(通用、高效、安全)
long long fac_iter(int n) {
    long long r = 1;
    for (int i = 2; i <= n; i++) r *= i;
    return r;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved