DrRacket功能计划

时间:2017-11-11 20:14:23

标签: scheme racket

我想解决的问题的描述如下,     注意:应该编写scheme函数并且能够在DrRacket中运行

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

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

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

到目前为止我的代码就是这个,

(define (right-digits x)
  (* (modulo abs x 1000) 100))

(define (left-digits y)
  (modulo abs y 100))

(define (make5 x y)
  (cond ((= (modulo abs x 10000) 0)
           -2)
        ((= (modulo abs y 1000) 0)
           -2)
        (else make5(+ (* 100 (right-digits 3 x)) (left-digits 2 y)))))

当我用类似(make5 12345 6789)测试函数时,我收到一条错误,说“预期的参数数量与给定数字不匹配”,“预期2,给定3”。

所以在某个地方我搞砸了这个论点,但我找不到错误。 有关如何让这只小狗工作的任何帮助,请告诉我。还在学习,要温柔。

3 个答案:

答案 0 :(得分:1)

您应首先测试辅助函数,然后在它们工作时向前迭代。我不会给你完整的源代码解决方案,因为你应该学到一些东西。两个提示:

  1. 您正在调用(modulo abs x 1000),但模数函数需要两个参数,您正在移交三个。
  2. 您案件中变量的绝对值是多少?

答案 1 :(得分:0)

这似乎有点过时了:

(define (right-digits x)
  (* (modulo abs x 1000) 100))

modulo需要2个参数,abs甚至不是数字。然而,它是一个函数,当应用于数字时,评估为绝对值。也许您实际上在考虑使用该功能?

(define (right-digits x)
  (* (modulo (abs x) 1000) 100))

答案 2 :(得分:0)

添加围绕make5的另一个引用。这允许您调用函数并传递参数。

(else (make5( (* 100 (right-digits 3 x)) (left-digits 2 y))))))