递归返回if语句调用

时间:2015-06-18 20:06:58

标签: c++ arrays recursion

我正在尝试设计一个以整数数组作为输入的程序,然后返回加起来为预定总和的所有值组合。为了清楚起见,当总计加起来为10时,我的递归函数将返回true。

但是,我还希望它返回包含此总数的数组中的值,因此我的定义如下;

  

如果suminarray返回true,则从数组中打印每个数字。

我的希望是,一旦达到我的基本子句,递归就会展开,我的if语句都将被评估,每个值都将从我的if语句中打印出来。但是,打印的所有内容都是构成目标总数的数组的最后一个值,而不是之前的所有值。

我可能误解了C ++的递归行为。我知道如何使用递归返回调用,但从逻辑上讲,如果在递归函数返回iftrue之前无法计算false语句,则它们不应该展开, ?

#include <iostream>

bool suminarray(int *numbers, const int &size, int startPos, int total);

using namespace std;

int main()
{
    int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int startPos = 0;
    int total = 0;
    suminarray(numbers, 10, 0, total);
    return 0;
}

bool suminarray(int *numbers, const int &size, int startPos, int total)
{
    if(total == 10)
    {
            cout << "result. " << endl;
            return true;
    }
    else if(total > 10)
    {
        return false;
    }
    else
    {

        for(int i = startPos; i < size; i++)
        {
            cout << " loop " <<  i << endl;
            cout << " total" <<  total << endl;

            if(suminarray(numbers, size, i+1, total+numbers[i]) == true)
            {
                cout << "Uses " << numbers[i] << endl;
            }
        }
    }
}

修改:修改源代码。

3 个答案:

答案 0 :(得分:0)

直接问题(你的编译器应该警告你),是你在最后的else块中没有return语句,这会导致函数在不返回true的情况下失败。 }或false,导致未定义的行为。如果你以最明显的方式解决这个问题:

else
{

    for(int i = startPos; i < size; i++)
    {
        cout << " loop " <<  i << endl;
        cout << " total" <<  total << endl;

        if(suminarray(numbers, size, i, total+numbers[i]) == true)
        {
            cout << "Uses " << numbers[i] << endl;
            return true;
        }
    }
    return false;
}

你的程序然后工作,但它只打印第一组值,它们总共找到10个。

这会立即显示您的方法存在的问题 - 每个函数调用只能返回ONCE - 您不能(轻松)让它返回成功并继续尝试更多替代方案。

答案 1 :(得分:0)

正如您已经猜到的那样,您想象递归函数展开的方式是错误的。

在你的例子中,你想要总共10个,数字从1开始,到9结束。所以,首先你的递归函数将使总数= 1.然后它将再添加1,直到它一直到第十个1.然后它将打印结果,然后它将展开1步,然后打印1.

到目前为止好吗?嗯,这里有偏离轨道的地方。在这一点上它并没有一直放松。它仍然保持在9,但这次它增加了2,失败回去直到它解除了8的总和。现在它尝试2并且这次工作!打印结果,然后2。

正如我所理解的那样,这并不是你想要的。你应该做的是做一些别的东西来保存你的答案,而不仅仅是打印它们。

答案 2 :(得分:0)

  

我知道如何使用递归返回调用,但从逻辑上讲,如果在递归函数返回true或false之前无法计算if语句,那么它们也不应该展开吗?

这是对的。你最后只看到一个print语句的原因是因为只有一个调用返回'true'。因此'if'语句只有一次,你只能看到一个“Uses”的print语句。

我相信你的错误是你在for循环后没有添加一个return语句。这意味着函数的返回值实际上是未定义的。编译时开始使用-Wall标志以确保不会出现此错误。这是一个我添加了“return true”的版本。在'for'循环之后:

#include <iostream>

bool suminarray(int *numbers, const int &size, int startPos, int total);

using namespace std;

int main()
{
    int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int startPos = 0;
    int total = 0;
    suminarray(numbers, 10, startPos, total);
    return 0;
}

bool suminarray(int *numbers, const int &size, int startPos, int total)
{
    if(total == 10)
    {
            cout << "result. " << endl;
            return true;
    }
    else if(total > 10)
    {
        return false;
    }
    else
    {

        for(int i = startPos; i < size; i++)
        {
            cout << " loop " <<  i << endl;
            cout << " total" <<  total << endl;

            if(suminarray(numbers, size, i, total+numbers[i]) == true)
            {
                cout << "Uses " << numbers[i] << endl;
            }
        }
    }
    return true;
}