我的递归函数有点麻烦。我将一个包含整数的数组传递给它,然后函数将它们加或减在一起。我得到了正确的加法函数,但我很难得到正确的减法位。
下面是我注意到的: size当前设置为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),它做的是逆运算--当它应该减去时,它补充说,当它应该被除法时,它乘以--它无法弄清楚为什么会发生这种情况。
发布于 2013-04-28 01:36:02
在调用函数后立即修改i。函数返回后,i增加了一个。当您从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作为结果,这正是您所期望的。
https://stackoverflow.com/questions/16258648
复制相似问题