gpt4 book ai didi

algorithm - 违约

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:41:48 25 4
gpt4 key购买 nike

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

(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...:

最佳答案

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

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

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

在这里你做 (rising-numbers (quotient n 10)) 作为一个数字参数但是因为我们已经在第一部分建立了这可以返回一个 bool 值你不能使用这个值作为第二个参数在 > 中。

那么你如何正确地做到这一点。出色地。一如既往,我们有基本情况:

(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 从不返回数字,始终返回 bool 值,您需要在每个步骤中检查当前值和下一个值。事实上,您会得到一个基本情况和当前数字与下一个数字之间的 n-1 次比较。

关于algorithm - 违约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48775803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com