2017-04-17 25 views
-1

Schemeに引数としてリストをとり、引数リストから偶数の整数のみを含むリストを返す関数を記述しようとしています。私は関数の引数として渡すために小さなリストを構築している私の機能even-listをテストするには偶数の整数リストを作成するためのScheme関数

(define (even-list n) 
    (if (even? car(n)) 
     (cons car(n) even-list(cdr(n))) 
     (even-list cdr(n)) 
    ) 
) 

:問題を通じて働いた後、これは私が出ているものです。私は以下のコードを実行したときしかし、それが起こる全てのリストが出力されていることである。

even-list (list 1 2 3 4 5 6 7 8 9 10) 

私は"even""even"then句を置き換えたとしてそれも、関数を呼び出していないようですが、ほとんどのようです出力されません。何か案は?

+0

有効なスキーム/ラケットではありません...質問を投稿する前に構文エラーを修正します。 – naomik

答えて

2

scheme/racketはprefixという表記法を使用しているため、適用されているプロシージャーはすべて開き角かっこで囲まれています。(function-name arg1 arg2 ...)

これはcar(n)cdr(n)even-list(...)などが不正な構文であり、それぞれ(car n)(cdr n)(even-list ...)などに置き換えなければならないことを意味します。

あなたの手順even-listに変更を行う場合、単純に

even-list (list 1 2 3 4 5 6 7 8 9 10) 

を書いて、あなたが/バインドしてもしなくてもよい(even-list)識別子を呼び出しているので、あなたは、出力の変更が表示されない理由でもあります(この場合は関数定義にバインドされています)、式(list 1 2 3 4 5 6 7 8 9 10)です。この式はリストの出力を返します。even-listの変更は、実際にはプロシージャの引数として渡されずに、listビルトインを使用して適用されているため、このリストに反映されません手順。

あなたが行を修正したら:

(even-list (list 1 2 3 4 5 6 7 8 9 10)) 

あなたの手順のロジックから生じるエラーに気づき始めます。たとえば、recursive関数には基数がありません。つまり、関数がリスト内で再帰的に0の要素のリストに到達すると、(car n)を適用しようとします。これは、carの契約違反です。引き数としてpair?

は、次のことを考えてみましょう:

(define (even-list lst) 
    (cond 
    ((null? lst) empty)       ; base case (empty? list) 
    ((even? (car lst))       ; even? first element 
    (cons (car lst) (even-list (cdr lst)))) 
    (else (even-list (cdr lst))))) 

または、ビルトイン使用してfilter手順:

(define (even-list lst) 
    (filter even? lst)) 
関連する問題