2016-01-23 75 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子句中移動打印語句,即可在返回時檢查您何時到達數組末尾,然後完成。