2016-03-21 2 views
1

После написания:Сортировать функция с настраиваемой функцией Comparision

(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))))))) 

Как вы пишете функцию, которая может дополнительно принимать функцию сравнения в качестве параметра?

Пробовал:

(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))))) 

Но (sort-f '(4 3 8 2 5) <) возвращает тот же список. стр. Есть ли способ сделать этот код более элегантным, так как переписывая все car, cadr и cdr?

+0

Я не думаю, что ваш 'СНП-ASC' работает либо. Вероятно, вы должны попробовать что-то вроде [insertion sort] (https://en.wikipedia.org/wiki/Insertion_sort) или [quicksort] (https://en.wikipedia.org/wiki/Quicksort). В любом случае, чтобы использовать функцию, переданную как аргумент, вы можете просто сделать (F ARG1 ARG2) '. Нет необходимости в этом 'LAMBDA'. – jkiiski

+0

@jkiiski Не просто «нет необходимости в этом« лямбда », но он активно заставляет код не работать, поскольку' lambda' возвращает процедуру, которая всегда правдива. –

+1

@ ChrisJester-Young Возможно, jkiiski подумал, что X10D имел в виду '(cond ... (((lambda() (f (car l) (cadr l)))) ...)', который бы сработал. –

ответ

2

Ваш третий cond состояние филиала должно быть (f (car l) (cadr l)), а не (lambda() ...). Выражение lambda возвращает процедуру (которая не вызывается), и поскольку все процедуры являются правдивыми, четвертая (else) ветвь никогда не достигается.

То есть,

((lambda()(f (car l) (cadr l))) (cons (car l) (sort-f (cdr l) f))) 

должен быть

((f (car l) (cadr l)) (cons (car l) (sort-f (cdr l) f))) 
+0

Я думаю '((lambda() (f (car l) (cadr l)))' будет работать, но это это очень много лишнего ввода для '(f (car l) (cadr l))', а также гораздо менее читаемо. – Vatine

Смежные вопросы