【问题标题】:SICP Exercise 2.29 ConfusionSICP 练习 2.29 混淆
【发布时间】:2013-05-30 17:00:07
【问题描述】:

当我输入子问题 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 Scheme) 报告错误:“作为第一个参数传递给 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

我很困惑。任何人都可以试用这个问题并帮助我吗?

【问题讨论】:

  • 两个版本是等价的。
  • @Will 除了在使用let的版本中,m在测试前使用。
  • @TerjeD。我现在就去吃我不起眼的馅饼。 :)
  • 不要忘记接受回答您问题的答案。 :) 单击旁边的大绿色空 V 形标志轮廓。 (你会因此获得 +2 代表)。
  • @WillNess 谢谢提醒!我已经接受了 Terje 的回答。此外,我是新来的,非常感谢看到这么多热心的朋友! :-)

标签: lisp scheme sicp mit-scheme


【解决方案1】:

问题是在第一个版本中,(left-branch m)(right-branch m) 在您检查 m 是否代表移动设备之前调用。即m 可以是 一个数字,或nil

【讨论】:

  • 确实有道理!如果没有你的帮助,我需要很长时间才能发现我对“让”的理解的不足。非常感谢你,热心的男孩! :-)
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 2011-11-05
  • 2017-02-03
  • 2010-12-26
  • 2012-12-15
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多