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

C語言實現階乘求和:s = (1×1)! + (2×2)! + ... + (n×n)! 完整解析

     編輯:關於C語言

C語言遞歸實現平方階乘累加問題

在程式設計練習中,計算 s = (1*1)! + (2*2)! + (3*3)! + ... + (n*n)! 是一個經典的遞歸應用題目。本文將詳細拆解如何使用 C 語言通過函數嵌套調用與遞歸調用來高效求解該問題。

核心思路:分解為兩個遞歸函數

根據題目提示,我們可以將問題拆解為兩個層次:

  1. 基礎階乘函數:計算單個整數的階乘 n!
  2. 累加求和函數:計算從 1 到 n 的 (i*i)! 之和

程式碼實現詳解

1. 階乘函數 factorial()

// 計算 n 的階乘
int factorial(int n) {
    if (n == 0 || n == 1) {
        return 1;           // 0! = 1! = 1
    } else {
        return n * factorial(n - 1);  // 遞歸:n! = n × (n-1)!
    }
}

這是標準的遞歸寫法,終止條件為 n == 0 || n == 1,遞歸體為 n * factorial(n-1)。

2. 平方階乘累加函數 squareOfTheFactorial()

// 計算 s = (1*1)! + (2*2)! + ... + (n*n)!
int squareOfTheFactorial(int n) {
    if (n == 1 || n == 0) {
        return 1;   // 基礎情況:(1*1)! = 1
    } else {
        // 關鍵點:先算當前項 (n*n)!,再加上前 n-1 項的和
        return factorial(n * n) + squareOfTheFactorial(n - 1);
    }
}

此函數體現了函數嵌套調用(調用 factorial())與遞歸調用(自身調用 squareOfTheFactorial(n-1))的結合。

完整可執行範例

#include <stdio.h>

int factorial(int n);
int squareOfTheFactorial(int n);

int main() {
    int n;
    printf("請輸入正整數 n: ");
    scanf("%d", &n);
    
    if (n < 0) {
        printf("請輸入非負整數。\n");
        return 1;
    }
    
    int result = squareOfTheFactorial(n);
    printf("s = %d\n", result);
    return 0;
}

// 階乘遞歸實現
int factorial(int n) {
    if (n == 0 || n == 1) return 1;
    return n * factorial(n - 1);
}

// 平方階乘累加遞歸實現
int squareOfTheFactorial(int n) {
    if (n == 0 || n == 1) return 1;
    return factorial(n * n) + squareOfTheFactorial(n - 1);
}

執行結果示例

輸入 3 時:

  • (1*1)! = 1! = 1
  • (2*2)! = 4! = 24
  • (3*3)! = 9! = 362880
  • 總和 s = 1 + 24 + 362880 = 362905

注意事項與優化建議

  • 數據溢位:int 型別最大約 21 億,13! 即超過範圍。實際項目建議使用 long long 或大整數庫。
  • 遞歸深度:n 較大時可能導致棧溢位,可改用迭代(循環)實現階乘與累加。
  • 重複計算:當前寫法每次遞歸都重新計算階乘,可引入快取或改為迭代累積優化效能。

迭代版本參考(避免遞歸缺點)

long long factorial_iter(int n) {
    long long res = 1;
    for (int i = 2; i <= n; i++) res *= i;
    return res;
}

long long sum_square_factorial_iter(int n) {
    long long sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += factorial_iter(i * i);
    }
    return sum;
}

本文展示了從遞歸思維到代碼落地的完整過程,適合初學者理解遞歸、函數嵌套與數學問題程式化建模的關係。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved