さて、私はSchemeが初めてで、理解したと思っていましたが、この問題で混乱しました。リストのすべての要素を二乗したい。したがって、(mapsq '(1 2 3)) は (list 1 4 9) を返します。
私のコード:
(define mapsq
(lambda (ls)
(cond ((null? ls) 0)
(else (cons (car ls) (car ls))
(mapsq (cdr ls)))))))
さて、私はSchemeが初めてで、理解したと思っていましたが、この問題で混乱しました。リストのすべての要素を二乗したい。したがって、(mapsq '(1 2 3)) は (list 1 4 9) を返します。
私のコード:
(define mapsq
(lambda (ls)
(cond ((null? ls) 0)
(else (cons (car ls) (car ls))
(mapsq (cdr ls)))))))
実用的な(非学術的な)状況では、この問題は次のmap
手順を使用して簡単に解決できます。
(define mapsq
(lambda (ls)
(map (lambda (x) (* x x))
ls)))
もちろん、これが宿題であり、ソリューションを最初から実装する必要がある場合は、答えをスプーンで与えるべきではありません。自分で解決策を見つけて、空欄に記入してください。
(define mapsq
(lambda (ls)
(cond ((null? ls) ; If the list is empty
<???>) ; ... then return the empty list.
(else ; Otherwise
(cons (* <???> <???>) ; ... square the first element in the list
(mapsq <???>)))))) ; ... and advance the recursion.
ソリューションには2つの問題があります。1つは、基本ケースが返されない0
ことです。回答としてリストを作成している場合は、空のリストを返す必要があります。次に、再帰ステップでは、リスト内の現在の要素を実際に2乗するのではなく、*
演算子を使用してそれ自体を乗算するだけです。
あなたはそれをこのように書くことができます:
(define (mapsq xs)
(define (square x) (* x x))
(map square xs))
またはこれ:
(define (mapsq xs)
(map (lambda (x) (* x x)) xs))
または多分このように:
(define (mapsq xs)
(let loop ((xs xs) (sqs '()))
(if (null? xs)
(reverse sqs)
(loop (cdr xs) (cons (* (car xs) (car xs)) sqs)))))
またはこのようにさえ:
(define (mapsq xs)
(if (null? xs)
'()
(cons (* (car xs) (car xs)) (mapsq (cdr xs)))))
私の好みが最初の選択肢でしょう。2番目のオプションは短くなりますが、補助機能により最初のオプションが読みやすくなります。私はおそらく3番目または4番目のオプションを使用しないでしょう。
ちなみに、laser_wizardによる解決策も機能しません。
あなたがここで新しいことに気づきました。答えが気に入ったら、答えの横にある上矢印をクリックして、答えを出した人がポイントを獲得できるようにします。このマークはまた、読者のコミュニティに、答えに価値のあるものがあることを知らせます。正しいと確信できる答えが得られたら、答えの横にあるチェックマークをクリックします。それはまた、答えを与えた人にポイントを与え、さらに重要なことに、この答えがあなたの質問に最も正しく対処しているとあなたが信じていることを他の読者に知らせます。
(define (mapsq xs)
(map * xs xs))
> (mapsq '(1 2 3 4 5))
'(1 4 9 16 25)