我仍在学习高阶函数,并很快就会对它进行测验。我正在尝试编写一个程序,该程序采用相同长度的2个列表,并逐项从第二个减去第一个,直到在第一个位置得到0。
(check-expect (min (list 1 1 1) (list 2 4 6)) (list 2 4))
(check-expect (min (list 1 1) (list 2 3)) (list 1))
我可以在没有地图的情况下轻松完成此操作,但有什么办法可以在这里使用map
吗?
(map - 1 (list ...))
或当我把它传递到列表的第一个或休息时。
不会工作。我知道它接受一个函数并传递给列表的每个元素。我很迷惑。
答案 0 :(得分:1)
这不是开始学习map
的好例子。 map
高阶过程将列表作为输入,并返回与输出相同长度的另一个列表,其中函数应用于输入中的每个元素。看看为什么这不是一个明确的使用map
的案例?输出列表小于输入!
当然,可以完成,但它并不优雅,并且模糊了map
的真正目的:
(define (min lst1 lst2)
(if (zero? (first lst2)) ; if the first position in lst2 is zero
(rest lst2) ; then return the rest of it.
(min lst1 ; otherwise advance recursion
(map - lst2 lst1)))) ; ok, here `map` was useful
要了解最后一行中发生的事情,请想象输入列表是一个在另一个之上:
'(2 4 6)
'(1 1 1)
然后,map
应用-
函数元素:
(- 2 1)
(- 4 1)
(- 6 1)
每个操作的结果都收集在一个新列表中:
'(1 3 5)
这是map
的特例:当函数后面有多个列表时,它会在前进到下一个列表之前将函数应用于每个列表的第一个元素 - 因此函数必须接受尽可能多的参数因为有名单。 map
的常见情况是,您只需将函数应用于单个列表中的每个元素,但这是一个使用lambda
的好地方的方式:
(map (lambda (x) (* x x))
'(1 2 3 4 5))
=> '(1 4 9 16 25)