2016-06-01 10 views
2

Ich machte diese Kategorie zum Reversieren einer NSString in einer rekursiven Weise. Ich bekomme die richtige Antwort. Aber ich bin mir nicht sicher, ob dies in Ordnung ist mit Speicherverwaltung. Ich weiß nicht viel über Speicherverwaltung in Objective-C.Reverse NSString rekursiv in der Kategorie

Jeder andere effiziente Weg wäre sehr bewundernswert.

-(NSString *)reverseString{ 
    if ([self length]<2) { 
     return self; 
    } else { 
     return [[[self substringFromIndex:1] reverseString] stringByAppendingString:[self substringToIndex:1]]; 
    } 
} 

Doch diese Frage ist ähnlich wie Reverse NSString text aber nicht das Duplikat, weil ich hier mit Rekursion bin Umsetzung. Und ich habe speziell nach dem Speicherverbrauch gefragt, nicht nach einem Codebeispiel.

+0

Sie werden wahrscheinlich einen Stapelüberlauf verursachen, der versucht, eine lange Zeichenfolge umzukehren (Tausende von Buchstaben). Und Ihr Code erzeugt eine fehlerhafte Zeichenfolge mit Unicode-Zeichen, die als mehr als ein Zeichen codiert sind. – rmaddy

+0

Ehrlich gesagt, ist die Verwendung dieses rekursiven Algorithmus wahrscheinlich eine der am wenigsten nützlichen Möglichkeiten, eine Zeichenkette umzukehren. Das von Sanjit verknüpfte Duplikat hat viel bessere Ansätze als dieser Algorithmus. – rmaddy

+1

Versuchen Sie nur zum Spaß, eine Zeichenfolge umzukehren, die ein Emoji enthält. Wie geschrieben, sind die Raum- und Zeitanforderungen O (n^2), wobei n die Länge der ursprünglichen Zeichenkette ist. Eine Folge von 100.000 Zeichen bringt einen Mac in die Knie. – gnasher729

Antwort

2

Die Rekursion zum Umkehren einer Zeichenkette ist eine interessante Gedankenübung, aber es ist sehr langsam und eine schreckliche Verschwendung von Speicher. Sie müssen 2n temporäre Zeichenfolgen erstellen. (wobei n die Anzahl der Zeichen in der Zeichenfolge ist) n dieser Zeichenfolgen sind nur 1 Zeichen lang und die anderen n Zeichenfolgen sind 1, 2, 3, 4, 5 usw. Zeichen bis zu n-1.

(Speicherzuweisung ist sehr langsam.)

Und Sie schaffen n Rahmen stapeln. Wie rmaddy in seinem Kommentar sagt, wirst du wahrscheinlich einen Stapelüberlauf für sehr lange Strings verursachen.

Wenn Sie dies tun, um über Rekursion zu lernen, gut. Andernfalls werfen Sie diesen Ansatz vollständig und schreiben Code, der das Array rückwärts durchläuft und jedes Zeichen an eine veränderbare Zeichenfolge anfügt.

+0

Vielen Dank für das Verständnis, was unter der Haube ist. Ich könnte nicht denken, wie du gesagt hast. Sehr beschreibende Antwort auf meine Frage. Und ja, ich habe gerade angefangen, Objective-C zu lernen, also dachte ich mir "was ist mit der grundlegenden Rekursion" und endete damit. – nayem