(方案)使用自定义 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
。我不确定如何使用这两个功能。
如果有人能指导我(不给出答案),我将不胜感激!
注意:我无法修改map
或reduce
。
首先,您必须 map
对列表中的每个元素求平方,然后 在 之后使用 reduce
找到最小值。一些提示:
reduce
接收三个参数,第一个是将每个元素与初始最小值进行比较的过程,每当我们发现小于当前最小值的元素时更新其值。
- 第二个参数是要遍历的列表,在本例中是对每个元素求平方的结果:
(map (lambda (n) (* n n)) x)
.
- 第三个参数是初始最小值,在这种情况下是一个数字,使得所有其他人都小于它,例如正无穷大
+inf.0
。
请注意,这里使用 reduce
有点矫枉过正,因为该语言已经为我们提供了 min
函数。
我需要使用下面的 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
。我不确定如何使用这两个功能。
如果有人能指导我(不给出答案),我将不胜感激!
注意:我无法修改map
或reduce
。
首先,您必须 map
对列表中的每个元素求平方,然后 在 之后使用 reduce
找到最小值。一些提示:
reduce
接收三个参数,第一个是将每个元素与初始最小值进行比较的过程,每当我们发现小于当前最小值的元素时更新其值。- 第二个参数是要遍历的列表,在本例中是对每个元素求平方的结果:
(map (lambda (n) (* n n)) x)
. - 第三个参数是初始最小值,在这种情况下是一个数字,使得所有其他人都小于它,例如正无穷大
+inf.0
。
请注意,这里使用 reduce
有点矫枉过正,因为该语言已经为我们提供了 min
函数。