2017-01-24 3 views
-1

Ich gehe durch die Übungen von http://eloquentjavascript.net/03_functions.html und habe Schwierigkeiten, einen bestimmten Teil der Rekursion Übung zu verstehen. Die Übung fordert an, basierend auf einem als Parameter eingegebenen Wert "Wahr" oder "Falsch" zu drucken.Rückgabe isEven (-number); Eloquent Javascript

Nachdem ich diese Übung versucht hatte, erkannte ich, dass ich die falsche Technik verwendet hatte und nach der Lösung war ich verwirrt darüber, wie die zweite else if-Anweisung funktioniert, die überprüft, ob der eingegebene Parameter ein Minuswert ist.

 
function isEven(number){ 
    if (number == 0){ 
     return true; 
    } else if (number == 1){ 
     return false; 
    } else if (number < 0){ 
     return isEven(-number); 
    } else { 
     return isEven(number -2); 
    } 
} 
console.log(isEven(-2)); // true 
console.log(isEven(-5)); // false 

Ich bin verwirrt, wie der negativer Wert von selbst zB subtrahiert wird return isEven(-number), einen true oder false Wert. zB -5 -(-5) = 0, so wird dies true zurückgeben aber -5 ist kein gerader Wert, es ist ungerade.

Könnte ich eine Erklärung erhalten, wie dieser rekursive Code mit einem Minus-Parameter funktioniert?

+0

console.log (Nummer) – epascarello

+3

'-Nummer' bedeutet ** multiplizieren mit -1 **. Warum denkst du, dass es ** von sich selbst abzieht **? – Leo

+2

Guter Kummer! Das ist ohne Zweifel das absolut schlechteste *** Beispiel für Rekursion, das ich je gesehen habe. Ich würde dem eloquenten JS-Buch nicht allein vertrauen, da es offensichtlich ist, dass der Autor viel zu faul ist, um anständige Beispiele zu finden. – paxdiablo

Antwort

0

Das negative Vorzeichen wandelt eine negative Zahl in eine positive um, so dass der zweite rekursive Fall weiter um 2 subtrahiert werden kann, bis einer der Basisfälle (0 oder 1) erreicht ist ungerade :)

1

Sie haben ein kleines Missverständnis darüber, was -number tut. Dies zieht nicht die Anzahl von sich selbst ab, sondern erzeugt vielmehr das negative der Nummer, z.B. -5 =>5 oder 2 =>-2.

Ich werde sagen, dieser Code hat viele Möglichkeiten, es könnte aufgeräumt werden - die erste und wichtigste davon ist, dass es immens einfacher ist, mit dem Modulo-Operator (%), der für Ebenheit oder Ungerade zu testen gibt den Rest der Division einer Zahl durch eine andere Zahl zurück. In diesem Fall werden alle ungeraden ganzen Zahlen, die mit 2 modulo'd sind, 1 zurückgeben, und alle geraden Zahlen werden 0 zurückgeben. Dies wäre in fast jeder Hinsicht ein besserer Weg, dies zu tun, als nach 0 zu rekursieren. Eine allgemeine Faustregel - Wenn Sie in einer Hochsprache rekursiv arbeiten, um Grundrechenarten durchzuführen, gibt es wahrscheinlich eine einfachere Lösung.

+0

Ich verwendete anfangs den Modulus und war in der Lage, das Ergebnis, das ich wollte, sehr schnell und einfach zu erhalten, aber diese Aktivität verlangte nach rekursiven Techniken. Aus der Verwendung von console.log (Nummer) vor der if-Anweisung konnte ich sehen, dass der Wert -6 mit jeder Rekursion auf positive Werte aktualisiert wird und dann Nummer geht durch die letzte else-Anweisung Ich denke, ein besserer Weg ist uns Mathe .abs (Wert) oder tue dies (-6 X -1 = 6). Nach ein wenig Recherche habe ich festgestellt, dass die Verwendung des - Operators vor einem negativen Wert einen positiven Wert erzeugt, zB - (-6) = 6. Danke für die Rückmeldungen. – Markamillion

Verwandte Themen