因此,我正在尝试在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)))))))
我遇到了错误...
应用:不是程序;
期望可以应用于参数的过程
任何意见,将不胜感激。我是新手,仍然在尝试掌握所有内容。
最佳答案
不要将参数放在括号内-(abs(x))
的意思是“调用过程x
并将结果传递给abs
。(cons (first(y)second(y))
的意思是“cons
这四件事:first
的值;调用y
过程的结果; second
的值;以及调用y
过程的结果”。
(您在某些地方正确调用了过程。请遵循相同的模式。)
您还缺少几个条件下的比较; (= (modulo (abs x) 1000) 0)
。
输入不是列表,而是整数,因此您不能将length
,first
或任何此类内容应用于它们。
结果应该是一个整数,而不是一个列表,因此您不能使用append
和cons
构造它,而只能使用算术。
这些关于整数的事实应该使您入门:
n
的后四位数字是(modulo n 10000)
。 x
为12且y
为34,则x * 100 + y
为1234。还要注意,第二个数字在其数字上只有一个条件,而第一个数字有两个条件,而且关于定义辅助功能的注释并未留在那里,这对您没有辅助功能是一个挑战。
例如,如果您有辅助功能
(left-digits n x)
,它产生n
和x
数字(right-digits n x)
,它产生n
x
数字您可以写(描述使用单词“if”和“or”可能也不是巧合):
(define (make5 x y)
(if (or ( ... ))
-2
(+ (* 100 (right-digits 3 x)) (left-digits 2 y))))
由于您想忽略数字的符号,因此使用
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)))))
现在剩下的“全部”是填写条件并编写两个数字提取函数。
关于scheme - 方案功能(DrRacket),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47218016/