Lisp SICP练习2.29混乱

Lisp SICP练习2.29混乱,lisp,scheme,sicp,mit-scheme,Lisp,Scheme,Sicp,Mit Scheme,当我输入子问题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))

当我输入子问题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

我弄糊涂了。有人能试一下这个问题并帮我解决吗?

问题是在第一个版本中,
(左分支m)
(右分支m)
在检查
m
是否表示移动设备之前调用。i、 e.
m
可以
一个数字,或
nil

问题是在第一个版本中,
(左分支m)
(右分支m)
在检查
m
是否表示移动设备之前调用。i、 e.
m
可以
一个数字,或
nil

这两个版本是等效的。@除了在使用
let
的版本中,
m
在测试之前使用。@TerjeD。我现在就去吃我的馅饼。:)别忘了接受回答你问题的答案。:)单击它旁边的大绿色空V形标志轮廓。(你得到+2个重复)。@WillNess谢谢你的提醒!我接受了泰耶的回答。此外,我是新来这里的,非常感谢见到这么多热心的朋友!:-)这两个版本是等效的。@除了在使用
let
的版本中,在测试之前使用
m
。@TerjeD。我现在就去吃我的馅饼。:)别忘了接受回答你问题的答案。:)单击它旁边的大绿色空V形标志轮廓。(你得到+2个重复)。@WillNess谢谢你的提醒!我接受了泰耶的回答。此外,我是新来这里的,非常感谢见到这么多热心的朋友!:-)这是有道理的!如果没有你的帮助,我要花很长时间才能发现我对“let”理解的不足。非常感谢你,热心的孩子!:-)这是有道理的!如果没有你的帮助,我要花很长时间才能发现我对“let”理解的不足。非常感谢你,热心的孩子!:-)