• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Lispでリストの中身もすべて反転する関数)

Lispでリストの中身もすべて反転する関数

このQ&Aのポイント
  • Lispでリストの中身もすべて反転する関数を作成する方法を教えてください。
  • 自作のreverse関数を使用して、リストの中身を反転させる関数を作成したいです。
  • 作りたい関数の動作例として、(make-reverse '(a (b (c d))(e (f g)))) の結果は (((g f) e) ((d c) b) a) です。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

ちょっと答えのぼかし方が良くなかったかも。 > 先頭要素がまたリストだったときの処理として > 再帰的にreverse nをしてみたのですがうまくいきません。 どんな感じのプログラムになったかと、どううまく行かなかったのかを 書いて欲しかったのですが、まあそれはいいでしょう。 > その処理が終わった後にappendにどのように渡すのでしょうか? > appendに渡すときに新たに変数などを使って渡すのかと考えてみましたがうまく実現できません。 変数を使うというのもまあ使えなくはありませんが、Lispらしくはないですね。関数の戻り値をそのまま渡してしまえばいいです。 (car n) が リストだったときに行いたいことは、 (append (my-reverse (cdr n)) ;; cdr部を再帰的に処理した結果 (...) ;; car 部を再帰的に処理した結果 ) ;;これら二つを append する ということなのですがわかりますか? 全体としては (defun my-reverse (n) (if (null n) nil (if (consp (car n)) (append (my-reverse (cdr n)) (xxx (xxxx (xxxx)))) (append (my-reverse (cdr n)) (list (car n)))))) な感じになります。 > まだLisp習いはじめなので質問もおろそかなものですがすいません。 あともうちょい!

sin1224
質問者

お礼

本当にありがとうございます! おかげで何とかできました。Lispというのは初めて扱いましていろいろ わからないこともあったのですが親切丁寧に教えていただいたおかげで 問題がわかりました。 Lispを理解するのにはやはり再帰処理を理解しなくてはいけませんね。 これから勉強するに当たり、今回のような考え方を参考にさせていただきます。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>すいませんがもう少しヒントをいただけないでしょうか・・? > 先頭がリストである、という判定にはatomを使えばよいのでしょうか? >その場合そこにおける制御式というのがまだ分かりません・・・ うい。 atomでもできなかないですが、もっと直接的に listp とか conspで良いと思いますよ。 (両者の微妙な違いに注意) 制御式はたとえばCなんかだと if (null(n)) return nil if (listp(n)) .... else append(... のようになるわけですが、あいにくlispにはelseifのようなものはありませんので、 (if (null n) nil (if (consp (car n)) ;;先頭要素がまたリストだったときの処理 (append ... ;;それ以外 のような形になります。 最初のifのelse-partにさらに別のifがくるわけです。

sin1224
質問者

補足

先頭要素がまたリストだったときの処理として 再帰的にreverse nをしてみたのですがうまくいきません。 その処理が終わった後にappendにどのように渡すのでしょうか? appendに渡すときに新たに変数などを使って渡すのかと考えてみましたがうまく実現できません。まだLisp習いはじめなので質問もおろそかなものですがすいません。

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

んじゃヒントだけ。 リストの先頭から再帰的に処理していますが、 リストの先頭がリストの場合を考慮しましょう。 つまり、先頭がリストだったらそのリストをreverseしてから append に渡せばいいです。

sin1224
質問者

補足

すいませんがもう少しヒントをいただけないでしょうか・・? 先頭がリストである、という判定にはatomを使えばよいのでしょうか? その場合そこにおける制御式というのがまだ分かりません・・・

すると、全ての回答が全文表示されます。

関連するQ&A