0

我在使用递归函数时遇到了一些麻烦。我将一个包含整数的数组传递给它,然后该函数将它们全部相加或相减。我正确实现了加法功能,但我很难正确地得到减法位。

这是我注意到的: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 个),它正在执行 INVERSE 操作——当它应该减去时,它会添加,当它应该除法时,它会相乘——无法弄清楚为什么会发生这种情况。

4

1 回答 1

0

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作为您所期望的结果返回。

于 2013-04-28T01:36:02.813 回答