尝试递归获取数组元素的总和

时间:2019-11-09 12:18:38

标签: c++ arrays segmentation-fault

我试图在c ++上递归地找到数组元素的和。

#include <bits/stdc++.h>

using namespace std;

int findSum(int arr[], int b, int e)
{
    if(b == e)
        return arr[b];
    else
    {
        int mid = (b + e) / 2;
        int x = findSum(arr, b, mid);
        int y = findSum(arr, mid, e);

        return x + y;
    }
}

int main()
{
    int arr[] = {1, 6, 3, 10, 11, 4, 5, 9, 15, 2};

    cout << findSum(arr, 0, 9);

    cout << endl; system("pause");
    return 0;
}

运行后,我得到(发生异常。分段错误)

3 个答案:

答案 0 :(得分:1)

尝试使用c ++递归执行任何操作都是危险的。您的程序将有堆栈溢出的危险,因为它有多个重复的函数填充堆栈,每次调用它自己时都会变得更大。

因此,这是您可以迭代进行的方式:

 long int findsum(const int array[], int elementstart, int elementend) {
    long int summedArray = 0;
    for (int currentcell = elementstart; currentcell <= elementend; ++currentcell)
        summedArray += array[currentcell];
    return summedArray;
 }

答案 1 :(得分:1)

您的功能不正确。例如,如果数组只有一个元素,则该函数返回0。

除此之外,如果数组包含两个元素,则传递索引b = 0,e =1。然后中间索引等于0((b + e)/ 2 == 0),您再次递归调用具有相同值b = 0和e = 1的函数。因此存在无限递归。

您应该将范围指定为[开始索引,最后一个索引之后的索引]。

但是在任何情况下,该函数都可以编写得更简单。 Ywo索引是多余的。

下面有一个演示程序,显示了如何编写函数。

#include <iostream>

long long int findSum( const int a[], size_t n )
{
    return 
    n == 0 ? 0 
           : ( n == 1 ? *a 
                      : findSum( a, n / 2 ) + findSum( a + n / 2, n - n / 2 ) );
}

int main() 
{
    int arr[] = { 1, 6, 3, 10, 11, 4, 5, 9, 15, 2 };
    const size_t N = sizeof( arr ) / sizeof( *arr );

    std::cout << findSum (arr, N ) << '\n';

    return 0;
}

程序输出为

66

答案 2 :(得分:0)

您的代码中的问题已在的答案中得到了很好的解释 VladFromMoscow


无论如何,这是一个用于汇总集合元素的更简单的递归解决方案:

您可以保留一个变量,告诉您当前正在考虑的数组索引,当该索引大于数组的大小时,可以返回0,即求和的中性元素。

否则,您只需将arr[i]加到数组的剩余之和。

int findSum(const int arr[], const int i, const int size)
{
    if(i > size)
        return 0;
    return arr[i]+findSum(arr, i+1, size);
}

我觉得更轻松=)