这不是开始学习的好例子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)