Sorting 具有可自定义比较功能的排序功能
写完后:Sorting 具有可自定义比较功能的排序功能,sorting,scheme,lisp,racket,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)) ))))) 但是(sort-f'(4 3 8
(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)) )))))
但是
(sort-f'(4 3 8 2 5)您的第三个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)))
我认为你的SORT-ASC
也不起作用。你可能应该尝试类似于或的东西。无论如何,要使用作为参数传递的函数,你可以只做(F ARG1 ARG2)
。不需要那样LAMBDA
@jkiiski不仅仅是“不需要那样的LAMBDA
”,但它会主动导致代码不工作,因为lambda
返回一个过程,这个过程总是真实的。@ChrisJester-Young可能jkiiski认为X10D的意思是(cond…((lambda()(f(car l)(cadr l))))
,除了虚假的(和错误的)之外,它还可以工作lambda
,您可以通过使用first
等使其看起来更好。我忘记Scheme是否有它们,但如果没有,它们很容易定义。@tfbfirst
、second
等都内置在Racket中。SRFI 1中也可以用于其他Scheme实现。我猜((lambda()(f(car l)(cadr l)))
可以工作,但是对于(f(car l)(cadr l))
来说,这是非常多的额外输入,而且可读性要差得多。
((f (car l) (cadr l)) (cons (car l) (sort-f (cdr l) f)))