【发布时间】:2017-01-28 18:58:00
【问题描述】:
代码如下:
(define make-simple-sv-num
(lambda (delare)
(let ((tal (random-from-to 100000 1000000)))
(cond ((= (divisible? (sum-of-digits tal) delare) #t) tal)
(else (make-simple-sv-num))))))
所以我的规范是生成一个随机的 6 位数字,该数字也可以被输入变量“delare”整除。
我对代码的思考过程是将“tal”绑定到随机数,然后在计算中使用它,如果它检查出来,它将从“tal”返回数字。但是,如果它不满足条件,它将调用自己,我的想法是,当它这样做时,它会给“tal”一个新的随机数并继续这样做,直到满足条件,从而给我想要的数字类型。
我遇到了这个错误,我不明白如何解决它
=: contract violation
expected: number?
given: #t
argument position: 1st
other arguments...:
【问题讨论】:
-
如错误消息所示,
=仅适用于数字。请改用equal?。对于布尔值,您也可以使用eq?,但如果您不了解每个运算符如何工作的复杂性,equal?通常是更安全的选择。 -
不需要将布尔值与真值进行比较,只需使用布尔表达式作为测试即可;毕竟,
(P <=> true) <=> P -
再看递归调用:有什么问题?
-
谢谢各位,将 = 换成相等?解决了它,然后我注意到我忘记了递归的变量输入。似乎可以按我现在的预期工作:)