具有可定制比较功能的排序功能

时间:2016-03-21 17:11:58

标签: sorting scheme lisp racket

写完后:

(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) <)返回相同的列表。 附:有没有什么方法可以通过某种方式重写所有carcadrcdr来使这些代码看起来更优雅?

1 个答案:

答案 0 :(得分: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)))