1. ホーム
  2. recursion

[解決済み] リストを反転させるにはどうしたらいいですか?

2022-02-07 03:46:13

質問内容

Schemeでリストを反転させる関数は何ですか?

ネストされたリストを扱えるようにする必要があります。そうすれば、もしあなたが (reverse '(a (b c d) e)) を取得します。 (e (b c d) a) を出力します。

この問題にどのようにアプローチすればよいのでしょうか?ただ答えを求めるのではなく、勉強になるようなものを探しています。

どのように解決するのですか?

使用する。

(define (reverse1 l)
  (if (null? l)
     nil
     (append (reverse1 (cdr l)) (list (car l)))
  )
)

説明する。

ルール

  1. リストが空の場合、逆方向のリストも空です。
  2. そうでない場合は、リストの逆尾の後ろに、リストの最初の要素を追加します。

このコードをこのように見てください。

reverse1 は関数名、lはパラメータです。リストが空の場合、逆もまた空です。 そうでなければ reverse1 関数に、リストの末尾である (cdr l) を渡して、リストとして作成した最初の要素 (car l) にそれを追加します。

あなたの例(擬似コード)では

1st iteration
l=>(a (bcd)e)
car l => a
cdr l => (bcd)e
list(car l) =>(a)
------------------
reverse( cdr l)"+"(a)
------------------
2nd iteration
l=>((bcd)e)
car l => (bcd)
cdr l =>e
list(car l)=>(bcd)
--------------------
reverse(cdr l)"+"((bcd))+(a)
-----------------------
3rd iteration
l=>e
car l=> e
cdr l => nil
list (car l) =>(e)
-------------------------
(e (bcd)a)