3

我是 C++ 的初学者,我正在尝试编写一个递归算法,它返回数组中每个元素的总和,其值小于 x。

这是我的代码:

#include <iostream>

using namespace std;

int sumOfElement(int xList[],int x, int lengthOfArray){
    int  sum = 0;
    if (lengthOfArray == 0)
        return sum;
    else
        for (int i=0; i <= lengthOfArray; i++) {
            if(xList[i] < x)
                return sum + xList[i];
            else
                sumOfElement(xList,x,lengthOfArray-1);
    }
}


int main() {
    cout << "Size of Array: ";
    int size; 
    cin >> size;
    int *xList = new int[size];

    //Inputing array.
    cout << "Enter elements of array followed by spaces: ";

    for (int i = 0; i<size; i++)
        cin >> xList[i]; 

    cout << "Enter the integer value of x: " <<endl;
    int limit;
    cin >> limit;

    cout << "Sum of every element in an array with a value less than x: " << sumOfElement(xList,limit,size) << endl;

    return 0;
}

我正在使用 Visual Studio,在运行代码时,我收到了以下警告:“警告 C4715:'sumOfElement':并非所有控制路径都返回一个值。”当它要求我输入整数时,程序总是停止执行x 的值。

我的代码有什么问题?

4

2 回答 2

2
for (int i=0; i <= lengthOfArray; i++)
{
    if(xList[i] < x)
        return sum + xList[i];
    else sumOfElement(xList,x,lengthOfArray-1);
}

你不应该有一个 for 循环,递归函数应该“返回”更深层次的调用,所以

int retVal = 0;
if(xList[lengthOfArray-1] < x)
    retval = xList[lengthOfArray-1]
return retVal + sumOfElement(xList,x,lengthOfArray-1);
于 2013-05-28T23:45:24.623 回答
2

您在这里的方法并不是真正的递归。递归的想法是考虑一个基本情况,然后考虑如何在每个步骤中减少问题,直到达到基本情况。

对于这个问题:

  • 基本情况是数组的长度为零。在这种情况下,我们返回一个零和。(直观地说:如果数组为空,那么我们什么都不加,总和为零。)
  • 为了减少我们的数组,我们查看数组的最后一个元素(即 at lengthOfArray - 1)。我们处理这个元素:如果它小于x我们添加它,如果不是那么我们忽略它。然后,我们通过相同的方式(通过调用相同的函数,但数组长度不同)获得处理数组其余部分的结果,并在适用时添加我们的结果。

所以,一些示例代码:

int sumOfElement(int xList[], int x, int lengthOfArray){
    if (lengthOfArray == 0) {
        // base case
        return 0;
    } else {
        int value = xList[lengthOfArray-1];
        if (value < x) {
            // process the rest of the array and add our result
            return value + sumOfElement(xList, x, lengthOfArray - 1);
        } else {
            // process the rest of the array
            return sumOfElement(xList, x, lengthOfArray - 1);
        }
    }
}
于 2013-05-28T23:54:27.243 回答