布尔类型的递归

发布于 2024-12-11 06:19:38 字数 2082 浏览 0 评论 0原文

我正在尝试自己学习递归。我已经完成了以下练习,该练习应该返回 true 或 false,但由于某种原因它总是返回 false。

请有人告诉我为什么我的代码总是返回 false 以及我需要做什么才能纠正这种情况?

/*The subset sum problem is an important and classic problem in     computer
theory. Given a set of integers and a target number, your goal is to 
find a subset of those numbers that sum to that target number. For 
example, given the numbers {3, 7, 1, 8, -3} and the target sum 4, the 
subset {3, 1} sums to 4. On the other hand, if the target sum were 2, 
the result is false since there is no subset that sums to 2.*/
#include <iostream>
#include "genlib.h"
#include "simpio.h"
#include "vector.h"

bool CanMakeSum(Vector<int> & nums, int targetSum);
bool sumPermute(Vector<int> &prefix, Vector<int> &rest, int target);

int main()
{
    int numbers[5] = {3, 7, 1, 8, -3};
    Vector<int> nums;
    for (int i=0; i<5; i++)
    {
        nums.add(numbers[i]);
    }
    cout << "Introduce target: ";
    int target = GetInteger();
    if (CanMakeSum(nums, target))
        cout << "True" << endl;
    else
        cout << "False" << endl;
    return 0;
}

bool CanMakeSum(Vector<int> & nums, int targetSum)
{
    Vector<int> prefix;
    return sumPermute(prefix, nums, targetSum);
}

bool sumPermute(Vector<int> &prefix, Vector<int> &rest, int target)
{
    for (int i=0; i<rest.size(); i++)
    {
        Vector<int> newPrefix;
        newPrefix = prefix;
        newPrefix.add(rest[i]);
        // Check for target value.
        int sum = 0;
        for (int n=0; n<newPrefix.size(); n++)
        {
            sum += newPrefix[n];
        }
        if (sum == target)
            return true;
        Vector<int> newRest;
        for (int j=0; j<i; j++)
        {
            newRest.add(rest[j]);
        }
        for (int k = i+1; k<rest.size(); k++)
        {
            newRest.add(rest[k]);
        }
        sumPermute(newPrefix, newRest, target);
    }
    return false;
}

先感谢您。

I'm trying to learn recursion on my own. I've done the following exercise which should return true or false, but for some reason it always returns false.

May someone, please, tell me why my code always returns false and what I need to do in order to rectify this situation?

/*The subset sum problem is an important and classic problem in     computer
theory. Given a set of integers and a target number, your goal is to 
find a subset of those numbers that sum to that target number. For 
example, given the numbers {3, 7, 1, 8, -3} and the target sum 4, the 
subset {3, 1} sums to 4. On the other hand, if the target sum were 2, 
the result is false since there is no subset that sums to 2.*/
#include <iostream>
#include "genlib.h"
#include "simpio.h"
#include "vector.h"

bool CanMakeSum(Vector<int> & nums, int targetSum);
bool sumPermute(Vector<int> &prefix, Vector<int> &rest, int target);

int main()
{
    int numbers[5] = {3, 7, 1, 8, -3};
    Vector<int> nums;
    for (int i=0; i<5; i++)
    {
        nums.add(numbers[i]);
    }
    cout << "Introduce target: ";
    int target = GetInteger();
    if (CanMakeSum(nums, target))
        cout << "True" << endl;
    else
        cout << "False" << endl;
    return 0;
}

bool CanMakeSum(Vector<int> & nums, int targetSum)
{
    Vector<int> prefix;
    return sumPermute(prefix, nums, targetSum);
}

bool sumPermute(Vector<int> &prefix, Vector<int> &rest, int target)
{
    for (int i=0; i<rest.size(); i++)
    {
        Vector<int> newPrefix;
        newPrefix = prefix;
        newPrefix.add(rest[i]);
        // Check for target value.
        int sum = 0;
        for (int n=0; n<newPrefix.size(); n++)
        {
            sum += newPrefix[n];
        }
        if (sum == target)
            return true;
        Vector<int> newRest;
        for (int j=0; j<i; j++)
        {
            newRest.add(rest[j]);
        }
        for (int k = i+1; k<rest.size(); k++)
        {
            newRest.add(rest[k]);
        }
        sumPermute(newPrefix, newRest, target);
    }
    return false;
}

Thank you in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

万水千山粽是情ミ 2024-12-18 06:19:38

我没有运行代码,但看起来可能存在问题,即 sumPermutetrue 结果(在某些递归级别)不会被“以上”级别返回源。

要解决此问题,您需要测试 sumPermute 的返回值,如果 true 确保它立即传播回来。

尝试将其更改

sumPermute(newPrefix, newRest, target);

为:

if(sumPermute(newPrefix, newRest, target)) {
    return true;
}

更新:我在 IDEone 上测试了这个假设,确实这就是问题所在。

I didn't run the code, but it looks like there may be a problem with how the true result from sumPermute (in some recursion level) will not be propagated by the level "above" back to the source.

To fix this, you would need to test the return value of sumPermute and if true make sure that it propagates back immediately.

Try changing this:

sumPermute(newPrefix, newRest, target);

to this:

if(sumPermute(newPrefix, newRest, target)) {
    return true;
}

Update: I tested this hypothesis on IDEone, and indeed that's where the problem lies.

情泪▽动烟 2024-12-18 06:19:38

您不需要使用 if 语句。只需返回递归调用:

return sumPermute(newPrefix, newRest, tartget);

问题是您没有通过堆栈返回布尔值。

You do not need to use an if statement. Just return the recursive call:

return sumPermute(newPrefix, newRest, tartget);

The problem was you were not returning the boolean value back up through the stack.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文