我试图在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;
}
运行后,我得到(发生异常。分段错误)
答案 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);
}
我觉得更轻松=)