2016-01-23 37 views
0

出于某种原因,我得到的正确答案用数字来形成的所有可能的资金,但他们都被复制,我不知道为什么。有任何想法吗?返回,可以通过在阵列JAVA

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

import java.util.ArrayList; 

public class Problem2 
{ 

public static void getSum(int[] numbersArray, int starting, int sum) 
{ 
    if(numbersArray.length == starting) 
    { 
     return; 
    } 
    int value = sum + numbersArray[starting]; 

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

    System.out.print(sum + " " + value + " "); 
} 

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

嗨,为什么不使用临时数组变量,它包含已应用的所有值,如果已应用该值,则可以跳过该值并转到下一个值 – Webster

回答

0

我认为你的逻辑是不正确稍微当你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

+0

谢谢,我已经预感到了print语句在错误的地方。 – studenet212

0

你的代码工程(它由艇员选拔从输入数组元素的所有可能组合评估所有的款项),但与形式给出你不能消除重复。

下面是与集收集解决方案(收集,存储唯一的值):

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); 
     } 
    } 
} 

所以,这个想法是,当你从起始位置计算numersArray的所有款项“我+ 1”到结束(标上“recursiveSet”),你可以存储所有的一组新的(标记为“newSet”以上)总结,然后也加入到该集合numbersArray [I] +总和,其中总和是从以前的任何值设置(“recursiveSet”)。

+0

您不必避免重复的值。你只需要呈现“正确”的副本(f.e两次,6 + 1和2 + 4)。所以使用Sets不是方法。 – Matt

+0

对,没有得到正确的问题:) –

0

你只需要打印你的“递归树”的“叶子”,使用类似的方法。你有重复的是在递归调用序列中上水平所做的印刷品,当你在数组抵达终点和“后移”返回。只需在if子句中移动打印语句,即可在返回时检查您何时到达数组末尾,然后完成。