【问题标题】:Contract Violation合同违约
【发布时间】:2018-02-13 21:18:40
【问题描述】:

我正在尝试编写一个递归函数来测试输入的整数中的数字是否按升序排列。当我运行我的代码时,我收到了一个违反合同的错误。

(define (rising-numbers n)
  (if(zero? (truncate n))
     (modulo n 10)
     (> (modulo n 10) (rising-numbers (quotient n 10)))))

(rising-numbers 123)

这是我得到的错误:

>: contract violation
expected: real?
given: #t
argument position: 2nd
other arguments...:

【问题讨论】:

  • 这是一个引发相同错误的小表达式:(> 2 #true)。希望这会有所帮助。

标签: algorithm scheme racket r5rs


【解决方案1】:

看看你的函数,我发现你的函数在(zero? (truncate n)) 时返回一个数字,如果它为假,则返回一个布尔值。原因是> 总是返回一个布尔值#t#f。虽然返回不同的类型是该语言的一个特性,但当它在运行时变得不可预测时,它通常是一个错误。

根据错误消息,您已将布尔值作为> 的参数之一。所以问题出在你唯一使用>的地方:

(> (modulo n 10) (rising-numbers (quotient n 10)))

在这里,您将(rising-numbers (quotient n 10)) 用作数字参数,但由于我们已经在第一部分中建立了这可以返回布尔值,因此您不能将此值用作> 中的第二个参数。

那么你如何正确地做到这一点。好。与往常一样,我们有基本情况:

(rising-numbers 2); ==> #t

现在默认情况下应该这样做:

(rising-numbers 123)                             ; ==
(and (<= 2 3) (rising-numbers 12))               ; ==
(and (<= 2 3) (and (<= 1 2) (rising-numbers 1))) ; ==
(and #t #t)                                      ; ==> #t

在这种情况下rising-numbers 永远不会返回数字,总是布尔值,并且您需要在每一步中检查当前值和下一个值。实际上,您会得到一个基本情况和当前数字和下一个数字之间的 n-1 比较。

【讨论】:

    【解决方案2】:

    这个问题对于踏步机来说是一个完美的问题。确保语言级别为“Beginning Student”,除了您在定义窗口中粘贴的代码之外别无其他内容,然后单击“step”。我想你很快就会发现问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多