組み込みの map および zip 関数を使用して、Scheme 関数 zipadd を定義します。この関数は、2 つの数値リストを受け取り、対応する要素を加算したリストを返します。リストは同じ長さであると想定できます。たとえば、(zipadd '(1 2 3) '(4 5 6)) は (5 7 9) です。(zip と map を使用しない正解は 8 ポイントの価値があります。)
これを行う方法がわかりません。明日の試験の前に解決策を知りたいです。誰でも私を助けてもらえますか?
手始めに、Racketには手順が付属していませんが、zip
手順を実装するのは簡単です。
(define (zip lst1 lst2)
(map list lst1 lst2))
今あなたの質問に関して-のみを使用する解決策map
はこの問題を解決する最も簡単な方法であり、それは上記の手順と非常に似ています、空白を埋めるために何を使用できるかを考えてください:
(define (zipadd lst1 lst2)
(map <???> lst1 lst2))
それはもう少し工夫されていますがzip
、同じ解決策に到達するために使用することができます(そして満点を取得します)。それがどのように機能するかを理解してみてください-zip
両方のリストの要素のすべてのペアをくっつけて、2要素リストのリストを作成します。その後、map
そのリストをトラバースし、各要素にプロシージャを適用し(各要素は2つの要素のリストであることを忘れないでください)、結果を含む新しいリストを作成します。
(define (zipadd lst1 lst2)
(map (lambda (x) <???>) ; x is a list with two numbers, how to add them?
(zip lst1 lst2)))
最後に、完全を期すために、map
またはを使用しないソリューションzip
。map
これは、両方のリストの番号をペアごとに追加する必要がある特殊なケースの実装です。
(define (zipadd lst1 lst2)
(if <???> ; if either list is empty (*)
<???> ; then return the empty list
(cons (+ <???> <???>) ; else add the first elements of both lists
(zipadd <???> <???>)))) ; and advance the recursion over both lists
(*)覚えておいてください:両方のリストは同じ長さであると想定されています。
ソリューションのすべてのバリエーションを書いてみてください。同じ問題を解決するためにさまざまなアプローチを比較するのは興味深いことです。また、満点を取得する必要がある場合は、必ず上記の2番目のバージョンを使用map
してください。zip
これは、目前の問題の解決策を表現するための最も簡単でも効率的な方法でもないことに注意してください。