「初めての人のためのLISP[増補改訂版]」のP150のリストを逆順に関数がよくわかりません。
以下がその関数です。
(defun nreverse (x) (nrev2 x nil))
(defun nrev2 (x r)
(cond ((null x) r)
(t (nrev2 (cdr x) x)
(rplacd x r) )))
xがnilになるまで再帰を繰り返し、((null x) r) で再帰を戻りますがなぜs (rplacd x r)でリストが逆順になるんでしょうか。例えばxを(a b c)とすると
x:(a b c) r:nil
↓
x:(b c) r:(a b c)
↓
x:(c) r:(b c)
↓
x:nil r:(c)
↓
rplacd (c) (b c)
↓
rplacd (b c) (a b c)
↓
rplacd (a b c) nil
となるのですが、これじゃあ全然リストは逆順になりませんよね。
誰が教えてください、お願いします。
ちなみにrplacd は第一引数のcdrを第二引数に変換する関数です。
No.4ベストアンサー
- 回答日時:
「'(c)と'(b c)のcdrのcは実体は同じということでしょうか?」
という聞き方だと
(eq (car '(c)) (cadr '(b c))) は常に t を返すか?
と解釈したくなる (これは正しい) んだけど, それはおそらく「本来聞きたいこと」じゃないよね?
「'(c) で表される consセルと '(b c) の cdr である consセルの実体が同じかどうか」ということであればは一般には不定 (等しいこともあれば等しくないこともある). つまり
(equal '(c) (cdr '(b c))) => t
(eql '(c) (cdr '(b c))) => t または nil
(eq '(c) (cdr '(b c))) => t または nil
ということになる.
もっとも, 今の場合には eq の意味でも同じであることが (プログラムの作り方から) 保証される.
No.3
- 回答日時:
質問文にある関数はB子さんが解答したもので、正しく動かないとK先生に指摘されたものではないですか?
それをおいてもこの関数は一つのリストを共有して直接書きかえているので、質問文の後半にあるめも書きのように
考えてしまうと混乱してしまうと思います。
#2の方の回答で示されているリンク先にある図をよく見て追いかけてみてください。
つか前の質問どうしたの?
No.2
- 回答日時:
この回答への補足
おお!まさに聞きたい説明です!
ありがとうございます。
このページの 3.返り値 で (rplacd '(c) '(b c)) のところで carがcのセルのcdrからcarがbのセルに繋がり、そのセルのcdrはまた同じcarがcのセルに繋がっていますよね。これってつまり '(c)と'(b c)のcdrのcは実体は同じということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Excel(エクセル) VLOOKUP が機能しない、その原因は何 ? 8 2022/10/19 12:06
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- Excel(エクセル) Excelで漢字人名が勝手に並び変わる(続) 4 2023/03/21 21:28
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- Excel(エクセル) Excel 値を返す数式についてです 3 2022/11/21 20:08
- 数学 数学の質問です。 関数f(t)のフーリエ変換をF(ω)=∫[-∞→∞]f(t)exp(-iωt)dt 1 2023/07/29 01:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
エクセルVBA 配列からセルに「...
-
Excel UserForm の表示位置
-
VBA 複数条件の分岐処理の上手...
-
Excelで空白セル直前のセルデー...
-
特定の色のついたセルを削除
-
入力規則のリスト選択
-
Excel VBA IF文がうまく動作し...
-
EXCEL VBA 文中の書式ごと複写...
-
DataGridViewのフォーカス遷移...
-
DataGridViewで指定したセルの...
-
【VBA】【ユーザーフォーム_Lis...
-
EXCEL 2010 VBAでピボットで複...
-
Excel VBAでCheckboxの名前を変...
-
VBA にて、条件付き書式で背景...
-
【VBA】写真の貼り付けコードが...
-
VBAでユーザーフォームにセル値...
-
JTableにチェックBOXの埋め込み...
-
VBA コンボボックスで選んだも...
-
セルの半透明着色処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
Excel UserForm の表示位置
-
【Excel VBA】一番右端セルまで...
-
エクセルの合計を自動で表示さ...
-
【VBA】【ユーザーフォーム_Lis...
-
EXCEL VBA 文中の書式ごと複写...
-
下記のマクロの説明(意味)を...
-
Excel VBAでCheckboxの名前を変...
-
【VBA】写真の貼り付けコードが...
-
特定の色のついたセルを削除
-
VBA:日付を配列に入れ別セルに...
-
VBA にて、条件付き書式で背景...
-
DataGridViewのフォーカス遷移...
-
関数の引数でrangeを指定したとき
-
入力規則のリスト選択
-
DataGridViewで指定したセルの...
-
VBAでユーザーフォームにセル値...
-
複数指定セルの可視セルのみを...
おすすめ情報