在程式設計練習中,計算 s = (1*1)! + (2*2)! + (3*3)! + ... + (n*n)! 是一個經典的遞歸應用題目。本文將詳細拆解如何使用 C 語言通過函數嵌套調用與遞歸調用來高效求解該問題。
根據題目提示,我們可以將問題拆解為兩個層次:
n!(i*i)! 之和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)。
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! = 362880s = 1 + 24 + 362880 = 362905int 型別最大約 21 億,13! 即超過範圍。實際項目建議使用 long long 或大整數庫。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;
}
本文展示了從遞歸思維到代碼落地的完整過程,適合初學者理解遞歸、函數嵌套與數學問題程式化建模的關係。