...
(define (add-even lista)
(cond ((null? lista) empty)
((even? (car lista)) (cons (car lista) (add-even (cdr lista))))
(else (add-even (cdr lista)))))
(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)
..非常に効率的な方法ではありませんしかし、私はあなたのadd-even
手続きの末尾再帰を保つためにそれを使用していると仮定します。その場合は、その後...
あなたaccu
は、あなたのcons
チェーンの「穴」を埋める(リストの代わりに)手順することができます。計算の最後にaccu
を返す代わりに、最後の値を入力します。この場合はempty
で、代わりにidentity
で初期化します。
私は今あなたが末尾再帰を取得し、あなたが前方の順序でリストを作るので
(define (add-even lista)
(define (iter lista accu)
(cond ((null? lista) (accu empty))
((even? (car lista)) (iter (cdr lista)
(λ (rest) (accu(cons (car lista) rest)))))
(else (iter (cdr lista) accu))))
(iter lista identity))
(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)
を変え、あなたのコードの一部を示すために、太字を使用。どのように動作するかを確認するために、この評価を進めることをお勧めします。これはcontinuation passing styleです。
そして、あなたはVARSを少し
(define (add-even lista)
(define (iter lk)
(cond ((null? l) (k empty))
((even? (car l)) (iter (cdr l)
(λ (rest) (k (cons (car l) rest)))))
(else (iter (cdr l) k))))
(iter lista identity))
(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)
の名前を変更し、それはあなたがnamed-let
(define (add-even lista)
(let iter [(l lista)(k identity)]
(cond ((null? l) (k empty))
((even? (car l)) (iter (cdr l)
(λ (rest) (k (cons (car l) rest)))))
(else (iter (cdr l) k)))))
(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)
を使用した場合でも、もう少しクリーンアップならば、おそらく手順が良いだろう
...そしてそれはcle ANSアップ我々はまた、短い関数を作成するために使用することができ、内蔵for/list
#:when
句でcompose
とラケットで
(define (add-even lista)
(let iter [(l lista) (k identity)]
(cond ((null? l) (k empty))
((even? (car l)) (iter (cdr l) (compose k (curry cons (car l)))))
(else (iter (cdr l) k)))))
(add-even '(1 2 3 4 5 6 7))
; => '(2 4 6)
ないだろう 'フィルター「もう少しダイレクトですか? – naomik
OPは、特にフィルタなしで関数を作成したい(質問の2番目のパラグラフの最初の文を参照)。 – rnso