出于某种原因,我得到了正确的答案,但它们正在重复,我不知道为什么。有什么想法吗?
到目前为止,这是我的代码:
{{1}}
答案 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子句中的打印语句,该语句检查您何时到达数组末尾,然后再返回,并且您已完成。