rekursive string-reverse Funktion
schreiben Sie eine rekursive string-reverse Funktion aus Neugier, aber mit ein bisschen problem mit XOR gibt. Der ganze Sinn dieser Funktion ist nicht zu verwenden, iterator, der ist, warum es ist eine rekursive Funktion. dies ist keine Hausaufgabe, nur Neugier.
private static char[] ReverseNL(char[] arr, int index)
{
var len = arr.Length;
if (index > 0)
arr[len - index] ^= arr[index - 1];
return index-- < 1 ? arr : ReverseNL(arr, index);
}
scheint es jamble der erste Teil von meinem string
"hey there stack!" wird zu "ich♫→A ←E↨reht yeh"
ist es immer die erste Hälfte von dem Satz, der bekommt wirre...
UPDATE..
ich nehme an, XOR war auch nicht wirklich nötig hier.. so verwendet grundauftrag, auch losgeworden zurück.
private static void ReverseNL(char[] arr, int index) {
var len = arr.Length;
if (index > 0 && index > len / 2) {
var c = arr[len - index];
arr[len - index] = arr[index - 1];
arr[index - 1] = c;
index--;
ReverseNL(arr, index);
}
}
- Wie alt sind Sie?
- Offensichtlich alt genug, um zu werfen in einen Verweis auf eine Klasse South Park Lied in einer Frage (ob es angemessen ist oder nicht, ist eine andere Frage).
- Ich empfehle die änderung der Zeichenfolge, um ein standard-Satz, wie: "Der schnelle braune Fuchs springt über den faulen Hund"
- Ich denke, Sie wollen führen Sie eine swap, und Sie versuchen zu tun, ein XOR-swap (die scheitert, weil Sie haben den Algorithmus falsch). Verwenden Sie einfach ein simple-swap; XOR swap wird auf jeden Fall zu Verwirrung führen, für diejenigen, die nicht vollständig verstehen, wie es funktioniert.
- Oder vielleicht ein Palindrom, wie "aibohphobia"?
- Wissen Sie, was der XOR-operator nicht? Es sieht aus wie Sie denken, es zu tauschen charachters, das ist, was es tut: 10110110 XOR-00011100 wird: 10101010 So, warum bekommen Sie mumbo jumbo
- Hoffa: Blick auf den Schwanz von dem Ergebnis... Es funktioniert zum Teil.
- Sonic, was war der Kern der Frage? Tut es rekursiv? Sie tun es mit Xor? Oder einfach umkehren, mit welchen Mitteln?
- yah, wie ich später merkte, ich war dabei XOR nur einen Weg. ich versuchte wirklich zu tun swaps in beide Richtungen vor dem posting hier, aber es schien nicht zu funktionieren. ich frisiert, etwas auf 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, eine Lösung, die über XOR und Rekursion, versuchen Sie dies:
Brauchen Sie nicht, etwas zurückzugeben, da alles in das array. Natürlich können Sie einfach entfernen Sie die XOR-Teil und tauschen Sie Sie einfach mit den Elementen, aber das ist viel cooler. 😉
(edit: der index sollte bei 0 beginnen)
Rekursion ist fast immer verwendet, um Probleme einfacher. Rekursive algorithmen sind in der Regel funktionale, die in der Natur als gut (obwohl Sie nicht müssen).
Im Falle der Umkehrung einer Zeichenkette (oder ein
char[]
), "einfacher" bedeutet "Betrieb auf einem kleineren array".Zum Beispiel können Sie reduzieren, wie folgt:
(Auf der linken Seite werden die Daten reduziert; auf der rechten ist die Schnitt Daten).
In pseudocode, die Sie durchführen können, die Reduktion wie folgt:
Ich überlasse es an Ihnen, herauszufinden, was als Nächstes getan werden muss mit den Daten, die Sie haben.
Wahrscheinlich nicht der effizienteste, aber dies sollte Ihnen einige Ideen auf, wie man die Rekursion funktioniert ...
Eine Beobachtung: Sie sind in Betrieb und Rückgabe ein array. Immer das gleiche array. Ein array ist immer eine Referenz.
Das bedeutet, dass Ihre return-Anweisung ist kompliziert und irreführend. Nur am Ende mit
return arr;
in allen Fällen.Bedenkt, dass Teil ein allgemeiner Tipp: machen es einfacher, und Sie werden sehen, Fehler leichter. Dass
--
in der return-Anweisung allein sollte eine rote fahne.In diesem speziellen Beispiel, ich würde eher so machen:
Dem XOR muss zweimal aufgerufen werden, tauschen ein paar Elemente. Es wird immer nur einmal aufgerufen, über die erste Hälfte des Arrays. (Im edit: streng genommen, ist es erst einmal für jeden einzelnen Auftrag, so dass der Netto-Effekt ist, wie eine zwei-XOR swap auf die Hälfte des Arrays.)