1

シーケンスbinary-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)      
)       

助けてくれてありがとう。

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 の方法で考え始める必要があります。Scheme の方法では、より関数型のプログラミング スタイルが好まれます。

于 2012-11-18T04:12:25.620 に答える