(定義(チェックサム-2 ls) (if(null?ls) 0 (let([n 0]) (+(+ n 1))(* n(car ls))(checksum-2(cdr ls)))))
わかりました、私はこのコードを持っています、私がそれを正しく書いた場合、数(n)はリストを通過するたびに1ずつ増えるはずなので、n(実際には)は1 2 3 4のようになりますが、私はnにリストの車を掛けたい。
すべてがロードされますが、答えが返されると0になります。
ありがとう!
(定義(チェックサム-2 ls) (if(null?ls) 0 (let([n 0]) (+(+ n 1))(* n(car ls))(checksum-2(cdr ls)))))
わかりました、私はこのコードを持っています、私がそれを正しく書いた場合、数(n)はリストを通過するたびに1ずつ増えるはずなので、n(実際には)は1 2 3 4のようになりますが、私はnにリストの車を掛けたい。
すべてがロードされますが、答えが返されると0になります。
ありがとう!
コードを別の形式にすると、何が起こっているかを簡単に確認できる場合があります。
(define (checksum-2 ls)
(if (null? ls)
0
(let ([n 0])
(+ (+ n 1))
(* n (car ls))
(checksum-2 (cdr ls)))))
フォーム内let
では、式は順番に評価されますが、それらの結果を使用していません (最後のものを除く)。加算と乗算の結果は単に破棄されます。
この場合、アキュムレータを使用して再帰呼び出しを実行する新しいヘルパー関数を定義する必要があります。これは宿題か学習課題だと思いますので、完全な答えを出すつもりはありません。
UPDATE : あなたがする必要があるかもしれないことの種類のデモンストレーションとして、ここに から1
までの整数を合計するためのSchemeの同様の関数がありますn
:
(define (sum n)
(define (sum-helper n a)
(if (<= n 0)
a
(sum-helper (- n 1) (+ a n))))
(sum-helper n 0))
同様のフレームワークを使用して関数を実装できるはずですchecksum-2
。