(define (minim lst)
(COND
((NULL? (CDR lst)) (CAR lst))
(< (CAR lst) (minim (CDR lst)) (CAR lst))
(ELSE (minim (CDR lst))))
)
Run Code Online (Sandbox Code Playgroud)
(minim'(3 4 2 9 3 8))3
我已经发现它是第二行被评估并返回(任何列表的CAR).我错过了什么?
您在第二个条件中缺少括号.这使得"<"操作符可以操作三个元素而不是两个元素.正确的代码如下:
(define (minim lst)
(cond ((null? (cdr lst)) (car lst))
((< (car lst) (minim (cdr lst))) (car lst))
(else (minim (cdr lst)))) )
(minim '(3 4 2 9 3 8))
Run Code Online (Sandbox Code Playgroud)
但需要注意的是:此代码不是尾递归的.它一直到列表的末尾,并从那里开始比较(即,最后一个元素与之前的元素进行比较,依此类推).
更有效的实现将第一个元素与当前最小值进行比较,然后每次继续处理更短的列表.如果你这样做,你将需要一个保持当前最小值的附加函数参数(这相当于左边的折叠,而不是你实现的右边折叠).