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

C++ 遞歸實現數組前 N 個元素倒序輸出的正確寫法與尾遞歸優化

     編輯:程式設計綜合問答

原代碼問題

int fun(int str[]) {
    if(n==0) { return 0; }
    else {
        cout << str[n];
        --n;
        return fun(str); // 返回值無意義,且修改全局 n 破壞封裝
    }
}
  • 使用全局變數 n 導致函數不可復用、非線程安全。
  • 返回值 int 無實際用途,應改為 void。
  • 遞歸深度受限於棧大小,大數組可能棧溢出。

改進版:參數化遞歸

void printReverse(int arr[], int n) {
    if (n <= 0) return;          // 基線條件
    cout << arr[n-1] << ' ';     // 輸出當前元素(下標 n-1)
    printReverse(arr, n-1);      // 遞歸處理剩餘元素
}

調用示例:printReverse(str, n); // n 為需輸出的元素個數

尾遞歸與迭代等價性

上述遞歸屬於尾遞歸,編譯器優化後等價於迭代:

void printReverseIterative(int arr[], int n) {
    while (n > 0) {
        cout << arr[--n] << ' ';
    }

完整可運行示例

#include 
using namespace std;

void printReverse(int arr[], int n) {
    if (n <= 0) return;
    cout << arr[n-1] << ' ';
    printReverse(arr, n-1);
}

int main() {
    int arr[101];
    for (int i = 0; i <= 100; ++i) arr[i] = i;
    int n;
    cout << "輸入 N (1-101): ";
    cin >> n;
    if (n > 0 && n <= 101) printReverse(arr, n);
    return 0;
}

最佳實踐建議

  1. 優先使用迭代避免棧溢出風險。
  2. 必須用遞歸時,傳遞狀態參數而非依賴全局變數。
  3. 尾遞歸優化需編譯器支持(如 GCC -O2、MSVC /O2)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved