Nach dem Schreiben:Sortierfunktion mit anpassbaren Vergleichsfunktion
(define (sort-asc l)
(cond ((eq? l '()) '())
((eq? (cdr l) '()) (list (car l)))
((< (car l) (cadr l)) (cons (car l) (sort-asc (cdr l))))
(else (cons (cadr l) (sort-asc (cons (car l) (cddr l)))))))
Wie schreiben Sie eine Funktion, die zusätzlich eine Vergleichsfunktion als Parameter nehmen?
Versuchte:
(define (sort-f l f)
(cond ((eq? l '()) '())
((eq? (cdr l) '()) (list (car l)))
((lambda()(f (car l) (cadr l))) (cons (car l) (sort-f (cdr l) f)))
(else (cons (cadr l) (sort-f (cons (car l) (cddr l)) f)))))
Aber (sort-f '(4 3 8 2 5) <)
gibt die gleiche Liste. p.s. Gibt es eine Möglichkeit, diesen Code eleganter aussehen zu lassen, indem man alle car
's, cadr
' s und cdr
's irgendwie umschreibt?
sein Ich glaube nicht Ihre 'SORT-ASC' entweder funktioniert. Sie sollten wahrscheinlich etwas wie [Insertion sort] (https://en.wikipedia.org/wiki/Insertion_sort) oder [quicksort] (https://en.wikipedia.org/wiki/Quicksort) ausprobieren. Wie auch immer, um die als Argument übergebene Funktion zu verwenden, können Sie einfach '(F ARG1 ARG2)' verwenden. Keine Notwendigkeit für diese "LAMBDA". – jkiiski
@jkiiski Nicht nur "keine Notwendigkeit für das" Lambda "", sondern dass es aktiv bewirkt, dass der Code nicht funktioniert, da "Lambda" eine Prozedur zurückgibt, die immer truthy ist. –
@ ChrisJester-Young Vielleicht dachte jkiiski, dass X10D '' cond ... (((lambda() (f (car l) (cadr l))))) bedeutet hätte, was funktioniert hätte. –