我在使用递归函数时遇到了一些麻烦。我将一个包含整数的数组传递给它,然后函数将它们一起加或减。我正确地实现了加法功能,但我很难让减法位正确。
这是我注意到的:大小当前设置为5.要测试它我将函数的减法部分中的if(i == size)行更改为if(i ==(size - 3) ),它似乎从第一个元素(4 - 2)正确地减去第二个元素。但如果我让它再次运行,我得到9,而不是(4-2) - 7 = -5,我应该得到。是否可以添加-7?
此外,我非常感谢所有指针,但我也承认,这可能不是完成我想要做的最有效的计划。我是一个初学程序员,在我当前的程序中看到我出错的地方对我来说最有帮助,而不是我应该如何完成我的算法。
#include<iostream>
using namespace std;
int reduceArray(int array[], int size, char op, int i = 0)
{
if(op == '+')
{
if(size == 0)
return 0;
if(i == size)
return 0;
else
{
return array[i++] + reduceArray(array, size, '-', i + 1);
}
}
else if(op == '-')
{
if(size == 0)
return 0;
if(i == (size - 2)) //changing this to "size - n" changes how many numbers are subtracted
return 0;
else
{
return array[i++] - reduceArray(array, size, '-', i + 1);
}
}
}
int main()
{
int array[] = {4, 2, 7, 1, 9};
//cout << reduceArray(array, 5, '+') << endl; this bit works fine works fine
cout << reduceArray(array, 5, '-') << endl;
system("pause");
return 0;
}
编辑:实际上 - 分区计划也是如此。对于数组的第三个元素(7),它正在进行INVERSE操作 - 当它应该减去时,它会增加,当它应该除以时,它会相乘 - 无法弄清楚为什么会发生这种情况。
答案 0 :(得分:0)
您在调用该函数后立即修改i
。函数返回后i
增加1。当您从array[i]
检索值时,您正在检索错误的元素,实际上您正在执行array[i + 1] =
。您还访问了数组末尾之外的元素。
这些操作符的代码是按照您的预期从右到左而不是从左到右进行计算。在计算完成之前,您总是调用reduceArray
,因此它一直到数组的末尾,然后开始回溯(返回)并在每次返回后进行计算。要更正此问题,您需要在调用reduceArray
之前进行计算,然后对其返回的结果执行另一次计算。
if(i < (size - 3)) // This MUST be -1 in order to go to the end of the array!
{
// We're operating on the current array entry and the next entry.
// this is why (size - 1) is necessary to prevent accessing beyond
// the end of the array.
int result = array[i] - array[i + 1];
i += 2;
return result - reduceArray(array, size, '-', i);
}
return array[i];
这将返回-5
作为您期望的结果。