2016-08-29 5 views
1

Ich war in Codewars heute Morgen und es gibt diese Kata fragen nach einer Funktion, um eine Zeichenfolge als Parameter durch Rekursion Methode übergeben.Bitte erklären Sie diese rekursive JavaScript-Funktion

Die beste Lösung für dieses Problem aufgelistet war dies.

function reverse(str) { 
    return str.length > 1 ? reverse(str.slice(1)) + str[0] : str; 
} 

Ich recherchieren heute Morgen alle für diese und ich weiß immer noch nicht, was hier passiert:

+ str[0] 

bitte klärt das für mich Kann jemand?

+0

Ich nehme an, "beste Lösung" bedeutet beste rekursive Lösung?Ich bezweifle, dass dies eine effiziente Möglichkeit ist, eine Saite umzukehren. –

+0

Dies ist eine schlechte Lösung, da der rekursive Aufruf nicht in der Endposition ist. Versuchen Sie, die Funktion in eine tail rekursive Version zu konvertieren, um das Thema besser zu verstehen. Tipp: Accumulator passing style. – ftor

Antwort

2

Das Wesen der Funktion ist die folgende:

  1. Nehmen Sie den Teil aus dem zweiten Zeichen bis zum letzten
  2. Nehmen, um die umgekehrte Funktion
  3. rekursiv das erste Zeichen nehmen und es an das Ende anhang des Ergebnisses der rekursiven Aufruf
  4. das Ergebnis zurück

Daraus ergibt sich die folgende Logik, die (rekursiv) Funktionsaufrufe durch Klammern angegeben:

(A B C D E) 
((B C D E) A) 
(((C D E) B) A) 
((((D E) C) B) A) 
(((((E) D) C) B) A) 
+0

Danke es macht jetzt Sinn! – notforever

1

str.slice(1) „hackt“ die ersten Buchstaben der Zeichenfolge und gibt den Rest davon. So 'abcd'.slice(1) gibt Ihnen 'bcd'.

str[0] ist der erste Buchstabe der Zeichenfolge. 'abcd'[0] ist 'a'.

Also, str.slice(1) + str[0] nimmt den ersten Buchstaben der Zeichenfolge und "bewegt" es bis zum Ende: 'abcd' wird 'bcda'.

Dies betrifft nicht die rekursive Natur der Lösung, aber es beantwortet Ihre Frage über + str[0].

0

Der Operator + ist ein Verkettungszeichen für Zeichenfolge. Sie können stattdessen concat verwenden:

var reverse = str => str.length > 1 ? reverse(str.slice(1)).concat(str[0]) : str; 
console.log(reverse("123456789")); // 987654321 
1

Ich werde versuchen, die Funktion in einer „Menschen lesbarer“ Art und Weise

reverse = str => { 

    // If there is still string to reverse 
    if (str.length > 1) { 
     let firstChar = str[0] 
     let strWithoutFirstChar = str.slice(1) 

     // Notice only a part of the string 'comes back' here 
     // console.log(strWithoutFirstChar) // Might help 
     return reverse(strWithoutFirstChar) + firstChar 
    } 

    // Else return result as is 
    else { 
     return str 
    } 

} 

Dies ist die gleiche Funktion neu zu schreiben, aber ohne Ternäre und zu erklären, gut benannte Variablen.

Wenn Sie Kommentar- der console.log() Linie und rufen:

reverse('help'); 

Die Ausgabe sollte:

elp 
lp 
p 
'pleh' 

Hoffe, es hilft!

Verwandte Themen