数组求和:递归版、尾递归版、迭代版(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;
}

 

原文链接: https://www.cnblogs.com/pluse/p/13260183.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    数组求和:递归版、尾递归版、迭代版(C++语言实现)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/363311

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午2:52
下一篇 2023年3月2日 下午2:52

相关推荐