三位數 abc (100~999),滿足 a³ + b³ + c³ = abc。
1000 不是三位數,不在範圍內。
已知解:**153, 370, 371, 407** (共 4 個)。
用函數參數 `n` 表示當前檢查的數字,基底條件 `n > 999` 終止。
#include
/**
* 遞迴檢查並輸出水仙花數
* @param n 當前檢查的數字 (初始呼叫傳 100)
*/
void printNarcissistic(int n) {
// 終止條件:超出三位數範圍
if (n > 999) return;
// 分解百位、十位、個位
int a = n / 100; // 百位
int b = (n / 10) % 10; // 十位
int c = n % 10; // 個位
// 判斷水仙花數條件
if (a*a*a + b*b*b + c*c*c == n) {
printf("%d\n", n);
}
// 遞迴檢查下一個數字
printNarcissistic(n + 1);
}
int main() {
printf("1000 以內的水仙花數:\n");
printNarcissistic(100); // 從 100 開始遞迴
return 0;
}
| 遞迴層級 | n | a | b | c | a³+b³+c³ | 是否輸出 |
|---|---|---|---|---|---|---|
| 1 | 100 | 1 | 0 | 0 | 1 | 否 |
| ... | ... | ... | ... | ... | ... | ... | 54 | 153 | 1 | 5 | 3 | 1+125+27=153 | 是 → 印 153 |
| ... | ... | ... | ... | ... | ... | ... | 271 | 370 | 3 | 7 | 0 | 27+343+0=370 | 是 → 印 370 | 272 | 371 | 3 | 7 | 1 | 27+343+1=371 | 是 → 印 371 |
| ... | ... | ... | ... | ... | ... | ... | 308 | 407 | 4 | 0 | 7 | 64+0+343=407 | 是 → 印 407 |
| 900 | 999 | 9 | 9 | 9 | 2187 | 否 |
| 901 | 1000 | - | - | - | - | 終止返回 |
1000 以內的水仙花數:
153
370
371
407
⚠ 警告:900 層遞迴在大多數環境安全,但屬於「濫用遞迴」。實際工程中**必須用迴圈**。本解法僅為滿足教學題目限制。
將遞迴呼叫移至函數最後一行,GCC/Clang `-O2` 可優化為迴圈 (常數堆疊空間):
void printNarcissisticTail(int n) {
if (n > 999) return;
int a = n/100, b = (n/10)%10, c = n%10;
if (a*a*a + b*b*b + c*c*c == n) printf("%d\n", n);
printNarcissisticTail(n + 1); // 尾呼叫
}
遞迴遍歷 100~999 並判斷各位立方和等於自身,可正確輸出 4 個水仙花數 (153, 370, 371, 407)。**教學觀點理解遞迴替代迴圈即可,實務嚴禁此用法**。