将值列入清单

时间:2012-11-18 03:46:38

标签: scheme

我想根据二进制-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)      
)       

感谢您的帮助。

1 个答案:

答案 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方式思考 - 这有利于更具功能性的编程风格。