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

Noo*_*oob 4 scheme list

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

nim*_*odm 7

您在第二个条件中缺少括号.这使得"<"操作符可以操作三个元素而不是两个元素.正确的代码如下:

(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)

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

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