递归算法对数组中值小于x的每个元素求和

recursive algorithm to sum of every element in an array with a value lesser than x

本文关键字:元素 求和 小于 数组 递归算法      更新时间:2023-10-16

我是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的整数值时,它总是停止执行。

我的代码出了什么问题?

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

对于这个问题:

  • 基本情况是数组的长度为零时。在这种情况下,我们返回的和为零。(直观地说:如果数组为空,那么我们什么都不加,得到的和为零。(
  • 为了减少我们的数组,我们查看数组的最后一个元素(即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);
        }
    }
}
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);