2016-06-11 4 views
0

Ich habe eine rekursive Funktion schreiben, die zwei ganze Zahlen akzeptiert. Die Funktion gibt "true" zurück, wenn die erste Ziffernziffer gleich der zweiten Zahl ist, andernfalls gibt die Funktion false zurück.Rekursion java - Testen ist die Summe der beiden Ganzzahlen sind gleich Boolesche Funktion

die Funktion immer True zurückgeben.

Was mache ich falsch?

Der Code:

public static boolean amountEqual(int num1, int num2) { 
    int sum1 = 0, sum2 = 0; 

    if (num1 == 0 && num2 == 0 && sum1 == sum2) 
     return true; 
    else if (num1 == 0 && num2 == 0 && sum1 != sum2) 
     return false; 

    sum1 += num1 % 10; 
    sum2 += num2 % 10; 

    return amountEqual(num1/10, num2/10); 
} 

danken der

+0

Was ist der Zweck Ihrer beiden Variablen 'sum1' und' sum2'? – tfosra

+0

Jeder Aufruf hat seine eigene Version von 'sum1' und' sum2'. Wenn Sie einen Zustand zwischen Anrufen teilen möchten, übergeben Sie ihn als Argument. Verzichten Sie auf den Drang, global/instance vars zu verwenden. –

+0

sum1 = Summe aller Ziffern der ersten Zahl Sum2 = Summe aller Ziffern der zweiten Zahl – liran

Antwort

3

Was mache ich falsch?

Sie verwenden sum, die immer Null ist. Sie müssen einen Weg finden, Ihre sum1 und sum2 mit zu übergeben, so dass der letzte Aufruf eine Entscheidung basierend auf allen vorherigen Aufrufen treffen könnte.

Eine Möglichkeit, mit vier Parametern, indem die rekursive Funktion es ist zu tun, und das Hinzufügen einer zweiparametrige Überlastung der rekursiven Kette zu starten:

public static boolean amountEqual(int num1, int num2) { 
    return amountEqual(num1, num2, 0, 0); 
} 
private static boolean amountEqual(int num1, int num2, int sum1, int sum2) { 
    ... // your recursive code goes here 
} 

Ein weiterer Ansatz ist die Ziffer Differential zu berechnen, das heißt die Summe von Ziffern in num1 minus Summe der Ziffern in num2 und true zurück, wenn die Differenz Null ist:

public static boolean amountEqual(int num1, int num2) { 
    return digitDifferential(num1, num2) == 0; 
} 
private static int digitDifferential(int num1, int num2) { 
    return (num1 != 0 || num2 != 0) 
    ? num1%10 - num2%10 + digitDifferential(num1/10, num2/10) 
    : 0; 
} 
+0

FWIW man könnte 'sum1' und' sum2' in einen Parameter 'sum' zerquetschen, wenn die Ziffern von' num1' sind addiert zu 'sum' und die Ziffern von' num2' werden von 'sum2' subtrahiert. Aber das ist nur pingelig. –

+0

@MargaretBloom Das ist eine sehr schlaue Idee! Ich schlug einen anderen Ansatz vor, der auf der Berechnung der Differenz von Zahlen basiert und 'wahr' zurückgibt, wenn er als Null zurückkommt. Vielen Dank! – dasblinkenlight

+0

Dieser zweite Ansatz ist genau das, was ich gerade vorgeschlagen habe, aber mit einer leichten Verbesserung: Überspringe den letzten Rekursionsaufruf (und die zusätzlichen Div/Mod-Berechnungen, die damit einhergehen) mit 'num1 <10 && num2 <10? num1 - num2: ...' – Andreas

0

Zunächst einmal ist Ihre Frage unklar. Ich nahm an, dass Sie möchten, dass die Funktion wahr zurückgibt, wenn die Zahlen beider Zahlen gleich sind.

Zweitens nehmen Sie an, dass Zahlen von gleicher Länge sind und sie nicht sein könnten.

Drittens übergeben Sie nicht sum1 und sum2 als Parameter.

einfacher Ansatz wäre es, zwei Funktionen zu machen, wie folgt aus:

public static int digitSum(int num) { 
    if (num > 0) { 
     return num % 10 + digitSum(num/10); 
    } 
    else 
     return 0; 
} 

public static boolean amountEqual(int num1, int num2) { 
    return digitSum(num1) == digitSum(num2); 
} 
+0

Warum'/= 'wann'/'ist alles was du brauchst? --- Überspringe eine Rekursion mit 'if (num <10) return num;' – Andreas

+0

Sie gehen nicht davon aus, dass beide Zahlen gleich lang sind. Der Code endet, wenn beide Zahlen Null sind, wahr, aber da die nicht signifikanten Ziffern Null sind, wird implizit die Zahl mit unterschiedlichen Längen unterstützt. –

+0

@Andreas oops, du hast Recht. Bearbeitet. – Marebre8

0

die beiden ersten Zeile des Codes jedes Mal, wenn die amountEqual Methode aufrufen mit Nullen zwei neue Variablen initialisieren lässt Ihre Rekursion verfolgen

System.out.println(amountEqual(18,26)); 
     /* F(20,30) = F(18/10,26/10) [sum1 = 8 , sum2 = 6] 
      re init sum1 = 0 , sum2 =0 

      F(1,2) = F(1/10,2/10) [ sum1 = 1 , sum2 = 2] 
      re init sum1 = 0 , sum2 = 0 
        F(0,0) = true */ 
Verwandte Themen