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

C 語言遞迴輸出 1000 以內水仙花數:不使用迴圈的完整實作

     編輯:程式設計綜合問答

題目要求

  • C 語言
  • 遞迴函數
  • 輸出 1000 以內所有水仙花數 (三位數,各位立方和等於自身)
  • 不得使用迴圈 (for/while/do-while)

水仙花數定義與範圍

三位數 abc (100~999),滿足 a³ + b³ + c³ = abc。
1000 不是三位數,不在範圍內。
已知解:**153, 370, 371, 407** (共 4 個)。

遞迴策略:線性遞迴遍歷 100~999

用函數參數 `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;
}

執行流程追蹤 (關鍵節點)

遞迴層級nabca³+b³+c³是否輸出
11001001否
.....................
541531531+125+27=153是 → 印 153
.....................
27137037027+343+0=370是 → 印 370
27237137127+343+1=371是 → 印 371
.....................
30840740764+0+343=407是 → 印 407
9009999992187否
9011000----終止返回

輸出結果

1000 以內的水仙花數:
153
370
371
407

複雜度分析

  • 時間:O(900) = O(1) — 固定檢查 900 個數字,每個 O(1) 運算
  • 空間:O(900) 遞迴堆疊深度 — **可能導致堆疊溢位** (視編譯器/OS 限制,通常 10⁴~10⁵ 層安全)

⚠ 警告:900 層遞迴在大多數環境安全,但屬於「濫用遞迴」。實際工程中**必須用迴圈**。本解法僅為滿足教學題目限制。

尾遞迴優化版 (若編譯器支援 -O2/-O3)

將遞迴呼叫移至函數最後一行,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)。**教學觀點理解遞迴替代迴圈即可,實務嚴禁此用法**。

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