我尝试创建一个将列表中的二进制数转换为字符串的过程。示例输出:(binary->string '(1 1 0 1 0 0))应该提供"110100"。
(define reduce
(lambda (op base x) ;passing by name
(if (null? x)
base
(op (car x) (reduce op base (cdr x))))))下面是我的代码:
(define (binary->string lst)
(reduce (number->string lst list->string )))我知道这是错的,但这是迄今为止我做得最好的。请帮助我让它正常工作。
发布于 2021-09-28 07:06:24
在我向你展示解决方案之前,这里有一些建议:当你写球拍代码时,你应该检查参数的正确数量和它们的类型。
在本例中,您知道reduce需要(op base x),这是三个参数,但是当您使用一些未知的函数时,例如number->string,就会有Racket documentation,在简短的搜索之后,您将填充find number->string条目:
(数字->字符串z基数)→字符串?
Z:数字?
基数:(or/c 2 8 10 16) = 10
返回一个字符串,该字符串是以基数指定的基数中的z的打印形式(请参见打印数字)。如果z不精确,则基数必须为10,否则将引发exn:fail:contract异常。
示例:
(数字->字符串3.0)
"3.0“
(数字->字符串255 8)
"377“
正如您所看到的,您可以使用一个或两个参数调用此函数,但在这两种情况下,它们都必须为number。但是使用这个调用(number->string lst list->string ),您传递的是list和procedure-所以我已经可以断定您的代码将以错误结束。当你尝试在REPL中调用你的函数时,就会发生这样的事情:
> (binary->string '(1 0 0 1))
. . number->string: contract violation
expected: number?
given: '(1 0 0 1)
argument position: 1st
other arguments...:在仔细检查所写的内容之后,甚至在运行代码之前,您应该能够预测会发生什么。
以下是解决方案:
(define (binary->string lst)
(reduce string-append "" (map number->string lst)))您将使用map从list中的每个数字创建字符串,然后使用reduce和string-append连接这些字符串。
https://stackoverflow.com/questions/69354302
复制相似问题