我想根据二进制-e序列列出#t / #f语句。如果binary-e中的值为0,则lst中的值应为#t,或者如果为1,则应为#f。 n参数是lst应该有多长。但是它总是返回一个空列表。这是我的代码:
(define (mysequence n)
(define binary-e (list 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1))
(define (makelist lst k)
(cond((= k (- n 1)) lst)
((= 0 (list-ref binary-e k)) (begin (cons #t lst) (makelist lst (+ k 1)) ))
((= 1 (list-ref binary-e k)) (begin (cons #f lst) (makelist lst (+ k 1))))
)
)
(makelist '() 0)
)
感谢您的帮助。
答案 0 :(得分:3)
您可以使用map
:
(map (lambda (e)
(if (= e 0) #t #f))
binary-e)
甚至更短:
(map zero? binary-e)
但是如果你需要从头开始编写解决方案,我担心问题中的代码远非接近正确的答案。我会给你一些指示并告诉你正确的解决方案结构,所以你可以自己找到答案(因为这看起来很像家庭作业),但你必须完全重新思考你的答案。对于初学者,您不需要传递列表的大小:
(define (mysequence lst)
(cond ((<???> lst) ; if the list is empty
<???>) ; then return the empty list
((= <???> <???>) ; if the first element in the list is 0
(cons <???> ; then `cons` #t
(mysequence <???>))) ; and process the rest of the list
((= <???> <???>) ; if the first element in the list is 1
(cons <???> ; then `cons` #f
(mysequence <???>))))) ; and process the rest of the list
甚至更短:
(define (mysequence lst)
(if (<???> lst) ; if the list is empty
<???> ; then return the empty list
(cons ; else `cons`
<???> ; if the first element in list is zero #t else #f
(mysequence <???>)))) ; process the rest of the list
无论哪种方式,请这样称呼:
(define binary-e <???>) ; define the list outside the procedure
(mysequence binary-e) ; and pass it along as a parameter
当前问题中的代码看起来好像是为程序性语言编写的 - 特别是使用list-ref
来解决这类问题并不完全正确。你不得不停止思考C / C ++ / C#/ Java或者你通常使用的编程语言,并开始以Scheme方式思考 - 这有利于更具功能性的编程风格。