1

次のプログラムを動作させようとしていますが、何らかの理由で、入力に正しい量の引数が含まれていないと言われ続けます。なぜですか?これがプログラムです

(define (sum f lst)
   (cond
     ((null? lst)
       0)
     ((pair? (car lst))
      (+(f(sum (f car lst))) (f(sum (f cdr lst)))))
     (else
       (+ (f(car lst)) (f(sum (f cdr lst)))))))

そしてここに私の入力があります:(sum (lambda (x) (* x x)) '(1 2 3))

ありがとう!

ところで、私はコードのクレジットを取りません、私はこれを楽しんでいます(http://groups.engin.umd.umich.edu/CIS/course.des/cis400/scheme/listsum.htm)

4

1 に答える 1

4

あなたは確かに間違った数の引数をプロシージャに渡しています.そしてsum、式が間違っていることにf注意してください.渡され、2 つの引数が必要ですが、渡されるのは 1 つだけです。代わりにこれを試してください:(sum (f car lst))(sum (f cdr lst))(sum f (car lst))(sum f (cdr lst))fsum

(define (sum f lst)
  (cond ((null? lst)
         0)
        ((pair? (car lst))
         (+ (sum f (car lst)) (sum f (cdr lst))))
        (else
         (+ (f (car lst)) (sum f (cdr lst))))))

fさらに重要:間違った場所でプロシージャを呼び出しています。(car lst)がただの数値でありリストではない(car lst)場合、最後の行で必要な呼び出しは 1 つだけ(cdr lst)です。f再帰を正しく進めるためのパラメータとして渡すだけです。

より興味深い入力を使用して修正された手続きを試してみましょう - 実際、手続きは任意にネストされたリストのリストの合計を見つけることができます:

(sum (lambda (x) (* x x)) '(1 (2) (3 (4)) 5))
> 55

The Little SchemerまたはHow to Design Programsのいずれかを参照してください。どちらの本も、リストのリストに関するこの種の再帰的な問題の解決策を構築する方法を教えてくれます。

于 2012-09-17T11:11:41.477 に答える