(方案)使用自定义 map 和 reduce,在列表中找到最小值

(Scheme) Using custom map and reduce, find minimum value in a list

我需要使用下面的 2 个函数在对每个元素进行平方后找出列表中的最小值。

例如:(minSquare '(10 -2 5 9 -11) 应该打印出 4.


映射和减少代码:

(define map
  (lambda (f l)
    (if (null? l)
        '()
        (cons (f (car l)) (map f (cdr l))))))

(define reduce
  (lambda (op l id)
    (if (null? l)
        id
        (op (car l) (reduce op (cdr l) id)))))

我试过这个:

(define minSquare
  (lambda (x)
    (cond [(null? x) '()]
          [else (map minSquare (reduce * x (car x))) (minSquare (cdr x))])))

但是将列表中的所有数字乘以它们的平方传递给 map 然后崩溃给出 contract violation。我不确定如何使用这两个功能。

如果有人能指导我(不给出答案),我将不胜感激!

注意:我无法修改mapreduce

首先,您必须 map 对列表中的每个元素求平方,然后 之后使用 reduce 找到最小值。一些提示:

  • reduce 接收三个参数,第一个是将每个元素与初始最小值进行比较的过程,每当我们发现小于当前最小值的元素时更新其值。
  • 第二个参数是要遍历的列表,在本例中是对每个元素求平方的结果:(map (lambda (n) (* n n)) x).
  • 第三个参数是初始最小值,在这种情况下是一个数字,使得所有其他人都小于它,例如正无穷大+inf.0

请注意,这里使用 reduce 有点矫枉过正,因为该语言已经为我们提供了 min 函数。