写完后:
(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 :(得分: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)))