我在使用数组进行递归时有点困惑,任何人都可以纠正我的错误吗?
新的更新,根据问题需要一些行无法编辑
double sum_of_array(double x[],int size)
{
static double sum; <---can be edit
int index = 0; <--can be edit
if(index<size){
return sum + sum_of_array(x,size-1); <--can be edit
}
else {
something ; <--can be edit
return sum; <--can be edit
}
}
int main(void){
double x[] = {4.5,5.0,6.8};
double y[] = {4.7,3.4,2.5,5.2};
cout<<"Sum X = "<<sum_of_array(x,3)<<endl;
cout<<"Sum Y = "<<sum_of_array(y,4)<<endl;
return 0;
}
输出:
Sum of the element in X[]=15.3
Sum of the element in Y[]= 15.8
答案 0 :(得分:6)
你正试图制作一些极度过度工程的东西。你需要两件事 - 边缘情况(递归截止)和一般情况(递归下降)。在你的情况下,边缘情况是“数组大小为零”,一般情况是“抓住第一个元素并将其余的数组传递给递归”。
可能是这样的:
double sum_of_array( double x[], int size )
{
if( size == 0 ) { //this is the edge case
return 0;
}
// here you grab the first element and pass the rest of array into a recursive call
return x[0] + sum_of_array( x + 1, size - 1 );
}
答案 1 :(得分:2)
此代码中存在一些错误:
答案 2 :(得分:2)
递归函数的逻辑是错误的。你永远不会真正读取数组的内容。我很惊讶你得到了任何有意义的输出。
您需要重新考虑递归定义以执行此添加。
基本案例:
空数组的总和为0.
即,sum_of_array(x, 0) == 0.
1元素数组的总和是元素的值
即,sum_of_array(x, 1) == x[0]
递归案例:
n元素数组的和是第n个元素和第一个n-1
元素之和的总和
即,sum_of_array(x, n) == x[n-1] + sum_of_array(x, n-1)
弄清楚如何在你的函数中编码这个逻辑。
答案 3 :(得分:1)
您实际上从未将x[]
和y[]
中的值添加到sum
,此外,index
始终等于0
。您应该将它作为另一个参数传递给函数:
double sum_of_array(double x[], int size, int index)
{
if(index<size){
return x[index] + sum_of_array(x, size, index+1);
}
else {
return 0;
}
}
您实际上并不需要sum
变量。
答案 4 :(得分:1)
问题是您使用的是静态变量sum
而不是x[size - 1]
。目前显示如何解决这个问题是多余的(7个答案已经做到了这一点)。但是,这可以在内置c ++功能的一行中完成:
#include <algorithm>
double sum_of_array(double x[], int size)
{
return std::accumulate(x, x + size, 0.);
}
答案 5 :(得分:0)
错误是您没有初始化静态变量sum。
答案 6 :(得分:0)
我从这开始:
return sum + sum_of_array(x,size-1);
你不应该回来:
return x[size] + sum_of_array(x,size-1);
除此之外,你应该找到一种方法在初始调用函数之间将sum
设置为零,否则它将累积所有总和你试图总结的数组
关键是,你永远不会初始化sum
,所以它有一些垃圾。
当一个简单的for
循环可以解决问题时,使用递归是什么想法呢?这是家庭作业吗?
答案 7 :(得分:0)
double sum_of_array(double x[],int size)
{
size = size - 1;
if(size < 0){
return 0;
}
return x[size] + sum_of_array(x, size);
}
答案 8 :(得分:0)
好吧那应该是这样的:
double sum_of_array(double x[],int index)
{
int size = sizeof( x) / sizeof( x[0] );
if(index<size){
return x[index] + sum_of_array(x, index + 1);
}
return 0;
}
然后致电
sum_of_array(x,0);
IE总是第一次调用0作为索引
答案 9 :(得分:0)
好的最后一次尝试:
double sum_of_array(double x[], int index, int size)
{
if(index < size){
return x[index] + sum_of_array(x, index + 1, size);
}
else {
return 0;
}
}
然后
cout<<"Sum X = "<<sum_of_array(x,0,3)<<endl;
答案 10 :(得分:0)
我就是这样做的:
double sum_of_array(double x[], int size)
{
if(size == 0){
return 0;
}
else{
return x[--size] + sum_of_array(x, size);
}
}
答案 11 :(得分:0)
我希望我仍能接受我的回答。不包括我的最新答案是2011年。
这是另一种计算数组中所有元素之和的解决方案。
double array_sum(double *p_array, int idx_low, int idx_high){
if(idx_low == idx_high)
return p_array[idx_low];
int idx_mid=idx_low+(idx_high-idx_low)/2;
return array_sum(p_array,idx_low,idx_mid)+array_sum(idx_mid+1, idx_high);
}
对此算法的分析可能会导致O(n*log(n))
的运行时间。
但是,你明智地用一点点盐来表达这句话。