-2
(定義(チェックサム-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になります。

ありがとう!

4

1 に答える 1

1

コードを別の形式にすると、何が起こっているかを簡単に確認できる場合があります。

(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

于 2012-09-26T02:32:24.660 に答える