數組求和:遞歸版、尾遞歸版、迭代版(C++語言實現)


 

說明:以下代碼僅大體表達核心思路,未對特殊情況進行判斷和處理

 

遞歸版實現:

按照尾遞歸的定義,該實現不是尾遞歸版本,但在GCC編譯器中使用-O1選項啟用優化也可以獲得類似尾遞歸優化的效果(Mac OS平台)。

#include <iostream>

using namespace std;

long sum(int array[], unsigned length)
{
    if (length < 1)
    {
        return 0;
    }

    return array[length - 1] + sum(array, length - 1);
}

int main()
{
    int size = 190000, array[size];
    for (int i = 1; i <= size; ++i)
    {
        array[i - 1] = i;
    }
    cout << sum(array, size) << endl;
}

 

 

尾遞歸版實現:

求和sum函數使用了重載,入口重載函數屏蔽了實際重載函數的參數細節,使得調用者只需要使用入口函數,並給入口函數數組及其長度即可。

尾遞歸版本並不會解決棧溢出問題,需要進行優化后才不會出現棧溢出問題,因此需要在GCC編譯器中使用-O1選項啟用優化來編譯解決。

#include <iostream>

using namespace std;

//實際尾遞歸重載函數
long sum(int array[], long result, unsigned length)
{
    if (length > 0)
    {
        result += array[length - 1];
        return sum(array, result, length - 1);
    }

    return result;
}

//入口重載函數
long sum(int array[], unsigned length)
{
    return sum(array, 0, length);
}

int main()
{
    //定義大小為1234567的數組
    int size = 1234567, array[size];

    //填充數組
    for (int i = 1; i <= size; ++i)
    {
        array[i - 1] = i;
    }

    //數組求和並輸出
    cout << sum(array, size) << endl;
}

 

 

迭代版:

#include <iostream>

using namespace std;

long sum(int array[], unsigned length)
{
    long sum = 0;
    while (length > 0)
    {
        sum += array[--length];
    }
    return sum;
}

int main()
{
    int size = 190000, array[size];
    for (int i = 1; i <= size; ++i)
    {
        array[i - 1] = i;
    }
    cout << sum(array, size) << endl;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM