使用地图和其他高阶函数

时间:2013-11-13 00:05:01

标签: list map scheme racket

我仍在学习高阶函数,并很快就会对它进行测验。我正在尝试编写一个程序,该程序采用相同长度的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 ...))

或当我把它传递到列表的第一个或休息时。

不会工作。我知道它接受一个函数并传递给列表的每个元素。我很迷惑。

1 个答案:

答案 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)