(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)) 3
我已经发现它是第二行被评估并返回(任何列表的CAR)。我错过了什么?
答案 0 :(得分:7)
您在第二个条件中缺少括号。这使得“&lt;”操作员操作三个元素而不是两个元素。正确的代码如下:
(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))
但需要注意的是:此代码不是尾递归。它一直到列表的末尾,并从那里开始比较(即,最后一个元素与之前的元素进行比较,依此类推)。
更高效的实现会将第一个元素与当前最小值进行比较,然后每次继续处理更短的列表。如果你这样做,你需要一个额外的函数参数来保持当前的最小值(这相当于左边的折叠而不是你实现的右边折叠)。