Im Moment kann ich nicht denken Sie an einen Weg, dies zu lösen, ohne die Iteration drei mal über die gesamte Liste (eine für jede list-ref und eine weitere für build-list.) Nicht die effizienteste Lösung, aber hier geht es:
Ich gehe davon aus, dass die Indizes für die angegebene Liste, sonst list-ref wird ein Fehler erzeugt. Die Indizes übergeben werden können, in beliebiger Reihenfolge, Bedeutung: idx1 werden kann, weniger als, gleich oder größer als idx2. Es funktioniert wie erwartet, die einen neue Liste mit den änderungen in Ort:
Diese Methode durchläuft die Liste höchstens zweimal:
(define(swap-index index1 index2 lst);; FIND-ELEMENTS -- ;; INPUT: count, an integer; lst, a list;; OUTPUT: a pair of the form '(a . b)(define(find-elements count lst)(cond((null? lst)'()); really, we should never reach this if indices are valid((= count index1); found the first element, so hold on to it while we look for the next one(cons(car lst)(find-elements (+1 count)(cdr lst))))((= count index2)(car lst)); found the second element, return part 2 of the pair(else ; since we only care about 2 elements we can just skip everything else(find-elements (+1 count)(cdr lst)))));; BUILD-LIST --;; INPUT: count, an integer; elements, a pair; lst, a list;; OUTPUT: a new list(define(build-list count elements lst)(cond((null? lst)'()); again, we shouldn't get here if indices are valid((= count index1); reached first index, substitute 2nd element and keep going(cons(cdr elements)(build-list (+1 count) elements (cdr lst))))((= count index2); reached second index, substitute 1st element and stop(cons(car elements)(cdr lst)))(else ; everything else just gets added to the list per usual(cons(car lst)(build-list (+1 count) elements (cdr lst))))))(build-list 0(find-elements 0 lst) lst)); call build-list using a call to find-elements as a parameter
Zunächst find-elements sieht Sie durch die Liste und gibt eine cons'd paar der Elemente, die wir tauschen wollen. Hinweis: dieser code hängt von der Annahme, dass die Indizes sind in Auftrag gegeben, so dass die kleinsten zuerst.
Weiter build-list nimmt die Ausgabe von find-elements so, dass während unserer nächsten Traversierung können wir Ersatz des entsprechenden Elements.
Hier ist die Lösung in clojure. Ich hoffe Algorithmus wäre hilfreich.
Im Moment kann ich nicht denken Sie an einen Weg, dies zu lösen, ohne die Iteration drei mal über die gesamte Liste (eine für jede
list-ref
und eine weitere fürbuild-list
.) Nicht die effizienteste Lösung, aber hier geht es:Ich gehe davon aus, dass die Indizes für die angegebene Liste, sonst
list-ref
wird ein Fehler erzeugt. Die Indizes übergeben werden können, in beliebiger Reihenfolge, Bedeutung:idx1
werden kann, weniger als, gleich oder größer alsidx2
. Es funktioniert wie erwartet, die einen neue Liste mit den änderungen in Ort:Diese Methode durchläuft die Liste höchstens zweimal:
Zunächst
find-elements
sieht Sie durch die Liste und gibt einecons
'd paar der Elemente, die wir tauschen wollen. Hinweis: dieser code hängt von der Annahme, dass die Indizes sind in Auftrag gegeben, so dass die kleinsten zuerst.Weiter
build-list
nimmt die Ausgabe vonfind-elements
so, dass während unserer nächsten Traversierung können wir Ersatz des entsprechenden Elements.