返回可以使用数组JAVA中的数字形成的所有可能的总和

时间:2016-01-23 15:27:51

标签: java

出于某种原因,我得到了正确的答案,但它们正在重复,我不知道为什么。有什么想法吗?

到目前为止,这是我的代码:

{{1}}

3 个答案:

答案 0 :(得分:1)

我认为当您使用getSum方法打印结果时,您的逻辑略有不正确。

我更改了getSum方法,现在它按预期工作:

public static void getSum(int[] numbersArray, int starting, int sum)
{
    if(numbersArray.length == starting)
    {
        // Now we print sum here
        System.out.println(sum);
        return;
    }

    int value = sum + numbersArray[starting];

    getSum(numbersArray, starting + 1, value);
    getSum(numbersArray, starting + 1, sum);
}

对于3, 5,它会8 3 5 0

对于1, 2, 4, 5,它会12 7 8 3 10 5 6 1 11 6 7 2 9 4 5 0

答案 1 :(得分:0)

您的代码有效(它通过从输入数组中选择所有可能的元素组合来评估所有总和),但是通过这种方法,您无法消除重复。

以下是Set集合的解决方案(仅存储唯一值的集合):

public class Problem2 
{
    public static Set getSum(int[] numbersArray, int starting)
    {
        if(numbersArray.length == starting)
        {   
            return new HashSet();
        }

        Set recursiveSet = getSum(numbersArray, starting + 1);

        Set newSet = new HashSet();

        int value = numbersArray[starting];

        for(Object object : recursiveSet) {
          int element = (int) object;

          newSet.add(element);
          newSet.add(element + value);
        }

        newSet.add(value);

        return newSet;
    }

    public static void main(String[] args)
    {
        Set set = getSum(new int[] {3, 5}, 0);

        for(Object object : set) {
          int element = (int) object;
          System.out.println(element);
        }
    }
}

所以,我们的想法是,当你从起始位置" i + 1"计算numersArray的所有总和时。到最后(标记为" recursiveSet"上面),你可以将所有总和存储在一个新的集合中(标记为" newSet"上面),然后还添加到那个集合numbersArray [i] + sum,其中sum是前一个Set中的任何值(" recursiveSet")。

答案 2 :(得分:0)

你只需打印"叶子"你的"递归树",使用类似的方法。您所拥有的副本是当您到达阵列末尾时,在递归调用序列中在较高级别完成的打印,并且"向后移动"返回。只需移动if子句中的打印语句,该语句检查您何时到达数组末尾,然后再返回,并且您已完成。