0

サブ問題 b に対する元の解決策を入力したとき。SICP の演習 2.29:

(define (total-weight m)
  (let ((left (left-branch m))
        (right (right-branch m)))
    (cond ((null? m) 0)
          ((not (pair? m)) m)
          (else
           (+ (total-weight (branch-structure left))
              (total-weight (branch-structure right)))))))

次のデータでテストしました。

(define left1 (make-branch 5 8))
(define right1 (make-branch 7 10))
(define m1 (make-mobile left1 right1))
(define right2 (make-branch 1 3))
(define m2 (make-mobile left2 right2))
(define left0 (make-branch 12 m1))
(define right0 (make-branch 5 m2))
(define m0 (make-mobile left0 right0))
(total-weight m0)

インタープリター (MIT/GNU スキーム) がエラーを報告しました:「cdr の最初の引数として渡されたオブジェクト 3 は正しいタイプではありません」。でも表情を消すと

(let ((left (left-branch m))
      (right (right-branch m)))
  ...)

次のコードを使用します。

(define (total-weight m)
  (cond ((null? m) 0)
        ((not (pair? m)) m)
        (else
         (+ (total-weight (branch-structure (left-branch m)))
            (total-weight (branch-structure (right-branch m)))))))

プログラムは正常に動作し、結果を出力しました

;Value: 27

混乱しました。誰でもこの問題を試して助けてもらえますか?

4

1 に答える 1

4

問題は、最初のバージョンで(left-branch m)は、モバイルを表す(right-branch m) かどうかを確認する前に呼び出されることです。mつまりm、数値、またはnil.

于 2013-05-30T19:04:10.030 に答える