1

我想根据序列 binary-e 制作一个#t/#f 语句列表。如果二进制 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)      
)       

谢谢你的帮助。

4

1 回答 1

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 方式思考——这有利于更函数式的编程。

于 2012-11-18T04:12:25.620 回答