【问题标题】:+: expects type <number> as 2nd argument, given: #<void>;+:期望类型 <number> 作为第二个参数,给定:#<void>;
【发布时间】:2013-05-29 02:36:28
【问题描述】:

我目前正在做 SICP 的练习 1.29,我的程序不断给我以下错误:

+: expects type &lt;number&gt; as 2nd argument, given: #&lt;void&gt;; other arguments were: 970299/500000

这是我使用 racket 运行的代码:

  (define (cube x)
    (* x x x))

  (define (integral2 f a b n)
    (define (get-mult k)
      (cond ((= k 0) 1)
            ((even? k) 4)
            (else 2)))
    (define (h b a n)
      (/ (- b a) n))
    (define (y f a b h k)
      (f (+ a (* k (h b a n)))))
    (define (iter f a b n k)
      (cond ((> n k)
             (+ (* (get-mult k)
                   (y f a b h k))
                (iter f a b n (+ k 1))))))
    (iter f a b n 0))

(integral2 cube 0 1 100)

我猜“第二个参数”是指我添加当前迭代和未来迭代的地方。但是,我不明白为什么第二个参数没有返回数字。有谁知道如何解决这个错误?

【问题讨论】:

  • 最好是你提供的代码是独立的,所以你应该包含cube的定义,这样你的例子就可以运行了。
  • h 是一个常数,并在包含所需 a b 和 n 值的闭包中定义。您的定义可以重写为不使用任何参数。 y 只需要 k,iter 只需要 k 和 n。您忘记了迭代中 n=k 的情况,并且您忘记了算法的 (* (/h 3) sum-terms) 部分

标签: scheme racket sicp


【解决方案1】:

“第二个参数”是指+ 的第二个参数,即表达式(iter f a b n (+ k 1))。根据错误消息,该表达式的计算结果为 void,而不是有意义的值。为什么会这样?

嗯,iter 的整个正文就是这个cond 表达式:

(cond ((> n k)
       (+ (* (get-mult k)
             (y f a b h k))
          (iter f a b n (+ k 1)))))

在什么情况下这个表达式不会计算为数字?那么,这个表达式有什么作用呢?它检查n 是否大于k,在这种情况下,它返回一个加法的结果,它应该是一个数字。但是如果n 小于k 或等于k 怎么办?那时它仍然需要返回一个数字,而现在不需要。

【讨论】:

    【解决方案2】:

    您的iter 过程中缺少else 子句。问问自己:(&lt;= n k) 时会发生什么?这是递归的基本情况,它也必须返回一个数字!

    (define (iter f a b n k)
      (cond ((> n k)
             (+ (* (get-mult k)
                   (y f a b h k))
                (iter f a b n (+ k 1))))
            (else <???>))) ; return the appropriate value
    

    【讨论】:

    • 球拍不允许单臂ifs。您必须提供 else 表达式(如果您希望它生效,则使用 when)。这很好,因为它可以帮助您发现错误。不幸的是,Racket 确实允许 conds 没有 else,它并不能帮助您发现类似的错误。
    猜你喜欢
    • 2018-08-15
    • 2017-01-05
    • 2017-07-29
    • 2021-12-05
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2019-10-23
    相关资源
    最近更新 更多