2017-05-18 4 views
0

私が持っている機能:ドット記法で再帰する方法は?

(define (func lst . conditions) 
    ; do something 
    (func (cdr lst) conditions)) 

しかし、二度目には、リスト内のfuncラップconditionsのように思えるし、私はきちんとその内容(機能)を使用することはできません。どのようにしてへの最初の呼び出しで扱われるのと同じ方法で、関数がそれを扱うようにconditionsを渡すべきですか?

+2

'(func(cdr lst)条件を適用する)'を使用します。 –

答えて

0

説明が完全ではありません。

(<variable1> ... <variablen> . <variablen+1>):R5RS、章4.1.4(強調鉱山)から引用するとスペースで区切られた期間は、最後の変数の前にいる場合、手順は、nが仮引数の数の前にはn個以上の引数を取ります期間(少なくとも1つある必要があります)。最後の変数のバインディングに格納された値は、となり、実際の引数の新しく割り当てられたリストは、他のすべての実引数が他の仮引数に対して照合された後に残されます。

つまり、conditionsは、最初からのリストです。以下のようなものを定義することによって、それを確認してください:

(define (func lst . conditions) 
    (display conditions) (newline)) 

アレクシス・キングが正しく指摘するように、あなたは「アンラップ」再びリストするapplyを使用する必要があります。しかし、それは、ドット表記法と呼ばれていない

(apply func (cdr lst) conditions) 
0

残りを引数。基本的には残りの引数はリストに収められています。

残りの引数の反対は、要素が関数の余分な引数であるかのように最後の引数としてリストを取るプロシージャです。 1つのジェネリックはapplyとして存在します。あなたは10要素のリストを持っている場合

(define (double-list . e) 
    (if (null? e) 
     '() 
     (list* (car e) 
      (car e) 
      (apply helper (cdr e))))) 

は、しかし、あなたは唯一の引数として渡される前にしばらく住んでサイズを小さくする10本のリストを作ってしまいます。最初のリストを維持する方が良いだろうと1ヘルパーでこれを行うことができます:

(define (double-list . e) 
    (define (helper e) 
    (if (null? e) 
     '() 
     (list* (car e) 
       (car e) 
       (helper (cdr e))))) 
    (helper e)) 

ヘルパーは単に最初の作成したリストを繰り返し処理の代わりに、それぞれの新しいリストを作成するので、それは同じ動作しますが、あまり使用メモリを搭載しました繰り返し。

関連する問題