我需要使用下面的两个函数在对每个元素进行平方后找出列表中的最小值。
例如:(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
。
答案 0 :(得分:2)
首先,您必须private <T> T[] arrayCopy(T[] original) {
//get the class type of the original array we passed in and determine the type, store in arrayType
Class<?> arrayType = original.getClass().getComponentType();
//declare array, cast to (T[]) that was determined using reflection, use java.lang.reflect to create a new instance of an Array(of arrayType variable, and the same length as the original
T[] copy = (T[])java.lang.reflect.Array.newInstance(arrayType, original.length);
//Use System and arraycopy to copy the array
System.arraycopy(original, 0, copy, 0, original.length);
return copy;
}
在列表中对每个元素进行平方,在之后使用map
找到最小值。一些提示:
reduce
接收三个参数,第一个是将每个元素与初始最小值进行比较的过程,每当我们找到一个小于当前最小值的元素时更新其值。reduce
。(map (lambda (n) (* n n)) x)
。 请注意,这里使用+inf.0
有点过分,因为该语言已经为我们提供了reduce
函数。