私はpythonで遊んでいた。 IDLEで次のコードを使用しました。
p = [1, 2]
p[1:1] = [p]
print p
出力は次のとおりです。
[1, [...], 2]
これは何ですか […]
?興味深いことに、私はこれを無限のリストのリストのリストとして使用できました。
p[1][1][1]....
必要な限り上記を書くことができ、それでも動作します。
編集:
これはあなたのコードが作成したものです
これは、最初と最後の要素が2つの数字(1と2)を指し、中央の要素がリスト自体を指しているリストです。
Common LISPでは、円形構造の印刷が有効な場合、そのようなオブジェクトは次のように印刷されます
#1=#(1 #1# 2)
これは、3つの要素を持つベクトルであるオブジェクト(#1=
のラベルが付いた1)が存在することを意味し、2番目の要素はオブジェクト自体(#1#
で後方参照)です。
Python代わりに、構造が[...]
で循環しているという情報を取得します。
この特定のケースでは、説明はあいまいではありません(リストを逆方向に指しますが、リストは1つだけなので、そのリストでなければなりません)。しかし、他のケースでは曖昧かもしれません...例えば
[1, [2, [...], 3]]
後方参照は、外部リストまたは内部リストを指す可能性があります。同じ方法で印刷されたこれらの2つの異なる構造は、
x = [1, [2, 3]]
x[1][1:1] = [x[1]]
y = [1, [2, 3]]
y[1][1:1] = [y]
print(x)
print(y)
そして彼らは
「その用途は何か」という質問に、具体的な例を示します。
グラフの縮小 は、コンピューター言語を解釈するために使用される評価戦略です。これは、特に関数型言語の遅延評価の一般的な戦略です。
開始点は、プログラムが実行する一連の「ステップ」を表すグラフを作成することです。そのプログラムで使用される制御構造に応じて、これは巡回グラフにつながる可能性があります(プログラムにはある種の「永久」ループが含まれているため-または、 "深さ"が既知の再帰を使用するため- 評価時間、ただしグラフ作成時間)...
そのようなグラフを表すには、気づいたようなinfinite "data structure"(recursive data structureと呼ばれることもあります)が必要です。ただし、通常はもう少し複雑です。
もしあなたがそのトピックに興味があるなら、ここに(他の多くのものの中で)その主題に関する講義があります:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
これは常にオブジェクト指向プログラミングで行われます。 2つのオブジェクトが直接または間接的に相互に参照している場合、それらは両方とも無限再帰構造(または、見方によっては同じ無限再帰構造の両方の部分)です。これが、リストのような原始的なものではあまり見ない理由です。通常、「無限リスト」よりも相互接続された「オブジェクト」として概念を説明する方がよいためです。
無限に再帰的な辞書で...
を取得することもできます。三角形の角の辞書が必要だとしましょう。各値は、その角に接続されている他の角の辞書です。次のように設定できます。
a = {}
b = {}
c = {}
triangle = {"a": a, "b": b, "c": c}
a["b"] = b
a["c"] = c
b["a"] = a
b["c"] = c
c["a"] = a
c["b"] = b
これでtriangle
(またはa
またはb
またはc
を印刷する場合)は、{...}
でいっぱいであることがわかります。任意の2つのコーナーが相互に参照しています。
私が理解したように、これは固定小数点の例です
p = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p