2016-01-18 13 views
5

Sagen wir n = 4. Mit Rekursion möchte ich zurück:Summe der Zahlen mit Rekursion Java

1 1 1 1 
1 1 2 
1 3 
2 1 1 
2 2 
3 1 
4 

Grundsätzlich möchte ich Nummer nehmen n und mit durch Zahlen 1,2,3 kombiniert und 4 erzeugen alle möglichen Variationen, wenn die Anzahl der sum == n.

Dies war meine erste Idee, aber es gibt mir

Exception in thread "main" java.lang.StackOverflowError

public static void test_2(String path, int sum, int n){ 
    if(sum == n){ 
     System.out.println(path); 
    } else { 
     test_2(path+"1 ", sum + 1, n); 
     test_2(path+"2 ", sum + 2, n); 
     test_2(path+"3 ", sum + 1, n); 
     test_2(path+"4 ", sum + 2, n); 
    } 
} 
+0

Was ist mit '1 2 1'? Du willst es nicht, oder hast du es gerade vermisst? – Gendarme

+0

Das habe ich vermisst, tut mir leid. – juku

+2

upvoted für das Stellen von Hausaufgaben (vermutlich) und das Bereitstellen eigenen Codes. Froh, dass manche Leute verstehen, wie man hier Fragen stellt. – sinclair

Antwort

5

Das Hauptproblem ist, dass Sie immer Rekursion, wenn sum != n. Wenn die Summe größer als n wird, stoppen Sie nie, daher die StackOverflowError Das bedeutet, wir brauchen einen Scheck hinzuzufügen und zu beenden, wenn die Summe größer wird:

public static void test_2(String path, int sum, int n) { 
    if (sum == n) { 
     System.out.println(path); 
    } else if (sum < n) { // <-- only recurse if the sum is less than the target 
     test_2(path+"1 ", sum + 1, n); 
     test_2(path+"2 ", sum + 2, n); 
     test_2(path+"3 ", sum + 3, n); 
     test_2(path+"4 ", sum + 4, n); 
    } 
} 

Als Randnotiz, in der zwei letzten Anrufe, Du hast 1 und 2 statt 3 und 4 geschrieben, aber das war wahrscheinlich nur ein Tippfehler.

Ausgabe von Aufruf test_2("", 0, 4):

1 1 1 1 
1 1 2 
1 2 1 
1 3 
2 1 1 
2 2 
3 1 
4 

Aber beachten Sie, dass Ihr aktueller Code nicht sehr dynamisch: es würde nicht funktionieren, wenn Sie Werte zu geben, sind größer als 4 für n. Ich würde vorschlagen, es ein wenig zu refaktorisieren.

+0

Nun, ich habe diesen Fall vermisst ..., danke für Hilfe! – juku