【问题标题】:scheme, racket help. Want to return number if it fulfills the criteria计划,球拍帮助。如果满足条件,想要返回号码
【发布时间】: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
  • 再看递归调用:有什么问题?
  • 谢谢各位,将 = 换成相等?解决了它,然后我注意到我忘记了递归的变量输入。似乎可以按我现在的预期工作:)

标签: scheme lisp racket


【解决方案1】:

我认为你的代码可以简单得多,就像:

(define (make-simple-sv-num declare)
    (let ([tal (random-from-to 100000 1000000)])
       (if (divisible? (sum-of-digits tal) delare)
           tal
           (make-simple-sv-num declare))))

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 2020-09-04
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多