0

我还在学习高阶函数,很快就会被测试。我正在尝试编写一个程序,该程序需要 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 ...))

或者当我将它传递给列表的第一个时,或者休息。

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

4

1 回答 1

1

这不是开始学习的好例子mapmap高阶过程将一个列表作为输入,并返回另一个与输出长度相同的列表,其中一个函数应用于输入中的每个元素。明白为什么这不是一个明确的使用案例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)
于 2013-11-13T00:31:52.877 回答