如果代码出现奇怪,请先抱歉。按照这里的分享说明看起来不错,但这是我的第一次。无论如何,我有一个类赋值,我需要创建一个递归函数,当给定一个数组时返回它的元素的总和。我找到了在线工作的解决方案,但它们看起来与我的相似。我的代码运行但是总和是一个巨大的整数,特别是在sum的输出下面的代码是-858993459。我以前见过类似的东西,我尝试过可能是一个常见的错误,但我至少找不到任何东西。请帮助解释发生了什么,我想使用我设置的参数(我已经看到了其他方式),因为我希望我的代码至少有点独特。提前谢谢大家!
#include <iostream>
#include <array>
#include <string>
using namespace std;
int getSumOfElements(int intArray[], int firstElement, int lastElement, int sum) {
if (firstElement > lastElement)
return sum;
else {
sum += intArray[firstElement] + intArray[lastElement];
getSumOfElements(intArray, firstElement + 1, lastElement - 1, sum);
}
}
int main()
{
int sum = 0, lastElement, firstElement = 0;
int exampleArray1[] = { 1, 5, 6, 12, 7 }, exampleArray2[] = { 3, -5, -16, 4, 10, 1, 7 };
lastElement = sizeof(exampleArray1) / sizeof(exampleArray1[0]);
sum = getSumOfElements(exampleArray1, firstElement, lastElement, sum);
cout << "The sum of all elements in Array1 are " << sum << endl;
lastElement = sizeof(exampleArray2) / sizeof(exampleArray2[0]);
sum = getSumOfElements(exampleArray2, firstElement, lastElement, sum);
cout << "The sum of all elements in Array2 are " << sum << endl;
system("pause");
}
答案 0 :(得分:1)
你没有在getSumOfElements的其他条件中返回任何东西,就像那个用于返回的垃圾值一样。
答案 1 :(得分:1)
您正在数组外部建立索引。
int lastElement = sizeof(exampleArray1) / sizeof(exampleArray1[0]);
sum = getSumOfElements(exampleArray1, firstElement, lastElement, sum);
然后你做
sum += intArray[firstElement] + intArray[lastElement];
在第一次调用期间,lastElement将在数组外部进行索引。 你应该做
sum = getSumOfElements(exampleArray1, firstElement, lastElement - 1, sum);
这就是为什么你会得到一个奇怪的&#34;整数值,如-858993459。
答案 2 :(得分:0)
感谢上面的所有帮助^^所有评论都得到了答案,但遗憾的是我不能选择多个。但是,我把我原来的问题重新编写为第一次被问到的时候,下面我将通过所有输入显示工作代码。
int getSumOfElements(int intArray[], int firstElement, int lastElement, int sum) {
if (firstElement > lastElement)
return sum;
else if (firstElement == lastElement) {
sum += intArray[firstElement];
return sum;
}
else {
sum += intArray[firstElement] + intArray[lastElement];
return getSumOfElements(intArray, firstElement + 1, lastElement - 1, sum);
}
}
int main()
{
int sum1, sum2, sum3, lastElement, firstElement = 0;
int exampleArray1[] = { 1, 5, 6, 12, 7 }, exampleArray2[] = { 3, -5, -16, 4, 10, 1, 7 },
exampleArray3[] = { 1, 3, 5, 6 };
lastElement = sizeof(exampleArray1) / sizeof(exampleArray1[0]) - 1;
sum1 = getSumOfElements(exampleArray1, firstElement, lastElement, 0);
cout << "The sum of all elements in Array1 are " << sum1 << endl;
lastElement = sizeof(exampleArray2) / sizeof(exampleArray2[0]) - 1;
sum2 = getSumOfElements(exampleArray2, firstElement, lastElement, 0);
cout << "The sum of all elements in Array2 are " << sum2 << endl;
lastElement = sizeof(exampleArray3) / sizeof(exampleArray3[0]) - 1;
sum3 = getSumOfElements(exampleArray3, firstElement, lastElement, 0);
cout << "The sum of all elements in Array3 are " << sum3 << endl;
system("pause");
}
答案 3 :(得分:0)
我知道自从您最初提出问题以来,您已对问题进行了修改,但现在尝试保留问题。
您的递归函数存在一些问题(原文如下):
int getSumOfElements(int intArray[], int firstElement, int lastElement, int sum) {
if (firstElement > lastElement)
return sum;
else if (firstElement == lastElement)
sum += firstElement;
else {
sum += intArray[firstElement] + intArray[lastElement];
getSumOfElements(intArray, firstElement + 1, lastElement - 1, sum);
}
}
在最简单的形式中,递归有两个主要内容:基本情况和递归情况。你有2个基本案例(很好):
您应该在实际逻辑中执行的唯一一次是递归情况。因此,您的基本案例应该只返回0
(对于第一个),或intArray[firstElement]
(值)为第二个。为什么?因为你的函数只返回从firstElement到lastElement的整数之和。如果您已经越过,那么您已经添加了所有数字。如果该索引相同,那么总和就是值本身,因为它是您仍然需要添加的唯一值。
您只在递归情况下进行添加。您要说的是getSumOfElements(..., first, last, sum)
与intArray[first] + intArray[last] + getSumOfElements(..., first+1, last-1, sum)
相同(添加结尾并通过再次执行来递归添加其余部分,始终更接近中间)。因此,您的递归情况应该只是添加数组的firstElement索引中的值,数组的lastElement索引,以及 rest 的总和价值观,并将其归还。
固定版本看起来像:
int getSumOfElements(int intArray[], int firstElement, int lastElement) {
if (firstElement > lastElement) {
return 0;
}
if (firstElement == lastElement) {
return intArray[firstElement];
}
else {
return intArray[firstElement] + intArray[lastElement] + getSumOfElements(intArray, firstElement + 1, lastElement - 1);
}
}
请注意,您不需要通过递归调用来携带总和,因为您在每次调用中都返回到目前为止的总和。我真的希望能够对递归有更多的了解。