2016-04-06 18 views
0

私はcons、cdr、carに関するもっとも基本的なコンセプトを使ってschemeのリストを逆転しようとしました。 ここでは、l-origが反転されるリストであり、l-countがカウンタとして機能します。Scheme lisp consとリスト

私のコードはここに行く:

(define (rev l-orig l-count) 
(
    if (null? l-count) 
    (cons l-orig '()) 
    (rev (cons (cdr l-orig) (car l-orig)) (cdr l-count)) 
) 
) 
(display (rev '(1 2 3 4 5) '(1 1 1 1 1))) 

、出力が正直なところ(((2 3 4 5) . 1)) ですが、私はLispでの初心者です、私はここに簡単な助けを必要としています。 この方法を使用する予定の人は誰でも私に正しい方法を提案できますか?

+0

関連?:https://stackoverflow.com/questions/19529829/how-to-recursively-reverse-:あなたは空のアキュムレータ内のすべての時間を渡す必要はありませんので、あなたはヘルパー関数を使用することができますリスト使用のみの基本操作/ 19536834#19536834 –

答えて

1

アキュムレータパラメータの助けを借りて、テール再帰を使用してリストをリバートしようとしています。アキュムレータは空のリストとして開始

(define (rev l-orig l-count) 
    (if (null? l-orig) 
     l-count 
     (rev (cdr l-orig) (cons (car l-orig) l-count)))) 

注意こと:最良の方法は、元のリストとcons終了時に返却されるアキュムレータの先頭に、その要素の各々を横断するであろう

(rev '(1 2 3 4 5) '()) 
=> '(5 4 3 2 1) 
+0

この解決策は容易に受け入れられます。しかし私の目的は、l-orig自体の逆のリストを得ることです。私はカウンタとしてl-countを使いたいだけです。これに関する助言? –

+0

しないでください。 Schemeでは、入力を変更しないようにしようとしています。代わりに、新しい出力を作成することを好みます。これは関数型プログラミングの方法です。 –

0

オスカーの答えが正しくあります:consには完璧です。

(define (rev xs) 
    (rev-accum xs '())) 

(define (rev-accum xs accum) 
    (if (null? xs) 
     accum 
     (rev-accum (cdr xs) (cons (car xs) accum))))