user971191
user971191

Reputation: 25

Recursion with boolean type

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.

Upvotes: 1

Views: 1186

Answers (2)

Mike L.
Mike L.

Reputation: 589

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.

Upvotes: 0

Jon
Jon

Reputation: 437904

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.

Upvotes: 1

Related Questions