在一个简单的脚本中,只返回scheme中列表的最小值,我的解决方案只返回列表的第一个值。什么是虫子?

时间:2011-06-06 03:56:53

标签: list scheme

(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)。我错过了什么?

1 个答案:

答案 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)) 

但需要注意的是:此代码不是尾递归。它一直到列表的末尾,并从那里开始比较(即,最后一个元素与之前的元素进行比较,依此类推)。

更高效的实现会将第一个元素与当前最小值进行比较,然后每次继续处理更短的列表。如果你这样做,你需要一个额外的函数参数来保持当前的最小值(这相当于左边的折叠而不是你实现的右边折叠)。