0

私はまだ高次関数について学んでおり、すぐにクイズを受ける予定です。同じ長さの 2 つのリストを取り、最初の位置が 0 になるまで、項目ごとに最初のリストを 2 番目から減算するプログラムを作成しようとしています。

(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 に答える