我是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的整数值。
我的代码出了什么问题?
答案 0 :(得分: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);
答案 1 :(得分:2)
这里的方法并不是真正的递归。递归的想法是考虑一个基本情况,然后考虑如何在每个步骤减少问题,直到你到达基本情况。
对于这个问题:
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);
}
}
}