lisp - SICP 练习 2.29 困惑

标签 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))
              (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

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

最佳答案

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

关于lisp - SICP 练习 2.29 困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16841942/

相关文章:

lisp - 在 clisp 中返回一个 lambda 函数,然后对其进行评估

lisp - 如何在 Lisp 中将有理数显示为一长串数字?

macros - 方案:如何在不带括号的语法规则中扩展具有多个变量的模式

list - 首先: contract violation error in racket/scheme for printing out a combination of list procedures

lisp - 计划中的展开功能

lisp - 我在Scheme中定义了一个新的乘法函数,我认为它应该是错误的,但是它有效

algorithm - 为什么我的立方根算法是错误的? SICP 练习 1.8

functional-programming - 函数列表

lisp - Gettin ZeroMQ 在 Windows 中使用 LISP

lisp - SICP 2.42 八皇后。帮忙看看我的代码有什么问题?