scheme - 方案功能(DrRacket)

标签 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)))))))

我遇到了错误...

应用:不是程序;
期望可以应用于参数的过程

任何意见,将不胜感激。我是新手,仍然在尝试掌握所有内容。

最佳答案

不要将参数放在括号内-(abs(x))的意思是“调用过程x并将结果传递给abs(cons (first(y)second(y))的意思是“cons这四件事:first的值;调用y过程的结果; second的值;以及调用y过程的结果”。
(您在某些地方正确调用了过程。请遵循相同的模式。)

您还缺少几个条件下的比较; (= (modulo (abs x) 1000) 0)

输入不是列表,而是整数,因此您不能将lengthfirst或任何此类内容应用于它们。
结果应该是一个整数,而不是一个列表,因此您不能使用appendcons构造它,而只能使用算术。

这些关于整数的事实应该使您入门:

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

  • 还要注意,第二个数字在其数字上只有一个条件,而第一个数字有两个条件,而且关于定义辅助功能的注释并未留在那里,这对您没有辅助功能是一个挑战。

    例如,如果您有辅助功能
  • (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/

    相关文章:

    syntax-error - 语法错误OCaml

    php - 在 laravel 5 中使用 cmd 插入原始数据

    scheme - 实用方案编程

    functional-programming - 写三个Scheme程序模拟这三个门: AND, OR和XOR

    recursion - 如何反转列表?

    clojure - Lisp 方言以及与 Java/C# 的比较

    scheme - 对 foldr/foldl 中的 "Init/Base"感到困惑( Racket )

    scheme - 变量和函数定义的顺序

    MySQL游标循环中的语法错误

    racket - 如何配置 Racket 解释器以支持命令历史?