我的这个C ++递归函数有什么问题?

时间:2015-11-19 23:42:04

标签: c++ recursion

如果代码出现奇怪,请先抱歉。按照这里的分享说明看起来不错,但这是我的第一次。无论如何,我有一个类赋值,我需要创建一个递归函数,当给定一个数组时返回它的元素的总和。我找到了在线工作的解决方案,但它们看起来与我的相似。我的代码运行但是总和是一个巨大的整数,特别是在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");
   }

4 个答案:

答案 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个基本案例(很好):

  1. 当前您处于firstElement索引大于lastElement索引的情况下(使用偶数大小的数组完成)
  2. 当您的firstElement索引与最后一个元素索引相同时(使用奇数大小的数组完成)
  3. 您应该在实际逻辑中执行的唯一一次是递归情况。因此,您的基本案例应该只返回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);
        }
    }
    

    请注意,您不需要通过递归调用来携带总和,因为您在每次调用中都返回到目前为止的总和。我真的希望能够对递归有更多的了解。

    工作样本:http://ideone.com/9xkMqT