方案功能(DrRacket)

时间:2017-11-10 07:51:38

标签: scheme syntax-error racket

所以,我正在尝试在scheme中编写以下函数,并且能够在DrRacket上运行它。问题如下,

make5 - 取两个整数,并返回一个5位整数,由第一个输入的最右边3位数和第二个输入的最左边2位数构成。例如,(make5 561432 254)将返回43225.

任何一个输入数字的负号都应该被忽略 - 也就是说,(make5 561432 -254)也会返回43225.

如果第一个数字少于三位数或最后三个数字以零开头,和/或第二个数字少于两位数, 功能应该返回-2。注意:您可能想要定义一些辅助功能。

到目前为止,这是我能够写的功能。

(define (make5 x y)
  (cond ((< (length x) 3) -2)
        ((< (length y) 2) -2)
        (((modulo (abs(x)) 1000) 0) -2)
        (((modulo (abs(y)) 1000) 0) -2)
        (else (append (list-tail x 3) (cons (first(y)second(y)))))))

我收到了错误......

申请:不是程序;  期望一个可以应用于参数的程序

任何建议都将不胜感激。我是新手,仍在努力掌握一切。

1 个答案:

答案 0 :(得分:1)

请勿将参数括在括号中 - x表示&#34;调用过程abs并将结果传递给(cons (first(y)second(y))
cons表示&#34; first这些四个事物:y的值;调用程序second的结果; y的值;以及调用程序(= (modulo (abs x) 1000) 0)&#34;。的结果 (你在某些地方正确地调用了程序。坚持使用相同的模式。)

你在几个条件下也错过了比较; length

输入不是列表,而是整数,因此您无法将firstappend或任何此类内容应用于他们。
结果应该是整数,而不是列表,因此您无法使用consn构建它,您应该只使用算术。

关于整数的这些事实应该让你开始:

  • 如果数字小于10000,则数字少于五位。
  • 非负数(modulo n 10000)的后四位是x
  • 如果y为12且x * 100 + y为34,则(left-digits n x)为1234。
  • 要获得整数中最左边的三个数字,可以重复除以10,直到数字小于1000为止。

另请注意,第二个数字在其数字上只有一个条件,而第一个有两个,并且关于定义辅助功能的注释并没有留在那里作为你没有它们的挑战。

例如,如果你有辅助功能

  • n,生成x最左边的(right-digits n x)位数,
  • n,生成最x(define (make5 x y) (if (or ( ... )) -2 (+ (* 100 (right-digits 3 x)) (left-digits 2 y))))

你可以写(也可能不是巧合,描述使用的是&#34;如果&#34;和&#34;或&#34;):

abs

由于您要忽略数字的符号,因此使用let开始处理(define (make5 signed-x signed-y) (let ((x (abs signed-x)) (y (abs signed-y))) (if (or ( ... )) -2 (+ (* 100 (right-digits 3 x)) (left-digits 2 y))))) 一次就很方便了:

name = ''.join(row.xpath('td[3]/a/text()'))

&#34;所有&#34;现在剩下的就是填写条件并编写两位数提取函数。