尝试获取数组的和';元素递归 我试图在C++上递归地找到数组元素的和。 #包括 使用名称空间std; int findSum(int arr[],int b,int e) { 如果(b==e) 返回arr[b]; 其他的 { int mid=(b+e)/2; int x=findSum(arr,b,mid); int y=findSum(arr,mid,e); 返回x+y; } } int main() { int arr[]={1,6,3,10,11,4,5,9,15,2}; CUT< P>试图在C++中递归地做任何事情是危险的。YOUT程序可能会有堆栈溢出的风险,因为它有一个函数填充堆栈的多个副本,每次调用它时都会变大。
因此,以下是您可以迭代执行的方法:尝试获取数组的和';元素递归 我试图在C++上递归地找到数组元素的和。 #包括 使用名称空间std; int findSum(int arr[],int b,int e) { 如果(b==e) 返回arr[b]; 其他的 { int mid=(b+e)/2; int x=findSum(arr,b,mid); int y=findSum(arr,mid,e); 返回x+y; } } int main() { int arr[]={1,6,3,10,11,4,5,9,15,2}; CUT< P>试图在C++中递归地做任何事情是危险的。YOUT程序可能会有堆栈溢出的风险,因为它有一个函数填充堆栈的多个副本,每次调用它时都会变大。,c++,arrays,segmentation-fault,C++,Arrays,Segmentation Fault,因此,以下是您可以迭代执行的方法: long int findsum(const int array[], int elementstart, int elementend) { long int summedArray = 0; for (int currentcell = elementstart; currentcell <= elementend; ++currentcell) summedArray += array[currentcell];
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;
}
long int findsum(常量int数组[],int元素开始,int元素结束){
长整数总和数组=0;
对于(int CurrnCys= EntEngEngEnter;CurrutCys),在C++中递归地做任何事情都是危险的。YOUT程序可能会有堆栈溢出的风险,因为它有一个函数填充堆栈的多个副本,每次调用它时都会变大。
因此,以下是您可以迭代执行的方法:
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;
}
long int findsum(常量int数组[],int元素开始,int元素结束){
长整数总和数组=0;
对于(int currentcell=elementstart;currentcell,代码中的问题已在
无论如何,这里有一个简单的递归解决方案,用于对集合的元素求和:
您可以保留一个变量,告诉您当前正在考虑的数组索引,当该索引大于数组大小时,您可以返回0
,即sum的中性元素
否则,只需将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);
}
我发现这更容易理解=)代码中的问题已经在
无论如何,这里有一个简单的递归解决方案,用于对集合的元素求和:
您可以保留一个变量,告诉您当前正在考虑的数组索引,当该索引大于数组大小时,您可以返回0
,即sum的中性元素
否则,只需将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);
}
我发现更容易理解=)您的函数不正确。例如,如果数组只有一个元素,则函数返回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;
}
您的函数不正确。例如,如果数组只有一个元素,则函数返回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;
}
此分区中的存储模块(在其中进行分区)需要彻底检查。你有一个小数据集。拿一张纸和一支铅笔,在树上逐行画出每次递归的具体情况。然后,在调试器中单步确认或攻击你的论文结论。顺便问一下,你为什么要使用如此复杂的方式递归求和元素?为什么不简单:findSum(arr,i+1)
@DavideSpataro,你能用一些代码解释一下这个(你正在分区的)存储模块吗需要彻底检查。你有一个小数据集。拿一张纸和一支铅笔,在树上逐行画出每次递归的具体情况。然后,在调试器中单步确认或攻击你的论文结论。顺便问一下,你为什么要使用如此复杂的方式递归求和元素?为什么不简单:findSum(arr,i+1)
@DavideSpataro,你能用一些codefs解释一下吗,如果我们走那条路,为什么不直接用std::cout想到那条路呢回答是因为他在评论中明确要求它。这不是问题作者使用的方法。@Vladfrommoskow我只是把它作为一个答案,因为他在评论中明确要求它。不要真的喜欢return
,想想中的3个单独的return
staments,如果块更简单的话眼睛。不管怎样,投了赞成票-回答得很好!不要真的喜欢return
,想想中3个独立的return
staments,如果块对眼睛来说更容易。不管怎样,投了赞成票-回答得好!