当我在做 C++ 测试时,我遇到了一个问题,要求我递归地填充一个数组,其中的值落在随机生成的最低值和最高值的范围内。这是我的递归函数代码:
int * recursivelyFillTheArray(int &arrLength, int &minValue, int &maxValue, int *arrToFill){
if (arrLength == 0) {
return arrToFill;
} else {
arrToFill[arrLength - 1] = rand() % (abs(minValue) + maxValue) - abs(minValue);
arrLength -= 1;
return recursivelyFillTheArray(arrLength, minValue, maxValue, arrToFill);
}
}
然而,返回的输出仅显示长度为 2 的数组,第二个值始终为 0。如 [-1,0]、[4,0]。
然后我在这个递归 FillTheArray() 中添加了一个 printArray() 函数,并且令人惊讶地发现该函数实际上在循环中修剪我的数组,而不是用值填充数组。喜欢:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0]
[0, 0]
[0, 0]
[-8, 0]
我想不通为什么。这是带有调试输出的完整编译代码。
能否帮我看看原因以及如何解决?
非常感谢!
最佳答案
主要问题是您正在修改 arrLength
- 不要不必要地通过引用传递。
您还使用递减的索引“向后”填充数组,但“向前”打印它,因此您在刚刚生成的值之前立即停止打印。
(作为奖励,打印那些数组元素是未定义的,因为你从未初始化数组。如果你用 999 初始化它,你会看到很多 999。)
如果您将 main
中的函数调用替换为等效循环,也许这会变得更清楚;
while (arrLength > 0) {
arrToFill[arrLength - 1] = rand() % (abs(minValue) + maxValue) - abs(minValue);
arrLength -= 1;
printArray(theArray, arrLength);
}
返回 arrToFill
参数似乎没有任何意义,所以可能是这样的:
void recursivelyFillTheArray(int arrLength, int minValue, int maxValue, int *arrToFill){
if (arrLength > 0) {
arrToFill[arrLength - 1] = rand() % (abs(minValue) + maxValue) - abs(minValue);
recursivelyFillTheArray(arrLength - 1, minValue, maxValue, arrToFill);
}
}
或者如果你想要一个“前向填充”,
void recursivelyFillTheArray(int arrLength, int minValue, int maxValue, int *arrToFill){
if (arrLength > 0) {
arrToFill[0] = rand() % (abs(minValue) + maxValue) - abs(minValue);
recursivelyFillTheArray(arrLength - 1, minValue, maxValue, arrToFill + 1);
}
}
关于C++:为什么我的递归修剪我的数组而不是执行它应该递归地用值填充数组的预期目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46468167/