C++:为什么我的递归修剪我的数组而不是执行它应该递归地用值填充数组的预期目的?

标签 c++ arrays recursion

当我在做 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]

我想不通为什么。这是带有调试输出的完整编译代码。

https://ideone.com/quszeM

能否帮我看看原因以及如何解决?

非常感谢!

最佳答案

主要问题是您正在修改 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/

相关文章:

mysql - MySql 的递归查询 - 获取所有子树

javascript - jquery:避免过多的递归

c++ - 删除 C++ 继承中虚拟类成员的代码重复

ios - 为什么 numberOfRowsInSection 仅针对一个部分被多次调用?

javascript - 在javascript中创建多维数组,自定义函数出错

arrays - CGGetOnlineDisplayList在Swift中的使用(数组作为参数)

python - 递归Python

c++ - "The C++ Programming Language"中描述的私有(private)继承用法

c++ - 在表达式模板中需要非常量表达式类

c++ - 使用映射来计算字符串输入