Jia*_*aro 14 python recursion cyclic-reference data-structures
我刚刚阅读了Mark Lutz的"学习Python",并且遇到了这个代码示例:
>>> L = ['grail']
>>> L.append(L)
>>> L
['grail', [...]]
Run Code Online (Sandbox Code Playgroud)
它被确定为循环数据结构.
所以我很想知道,这是我的问题:
似乎有点混乱,我认为这源于非常简短的代码示例...这里有几行使用相同的对象L
>>> L[0]
'grail'
>>> L[1][0]
'grail'
>>> L[1][1][0]
'grail'
Run Code Online (Sandbox Code Playgroud)
Cha*_*tin 18
许多事.循环缓冲区,例如:你有一些带有正面和背面的数据集合,但是有任意数量的节点,而最后一个节点的"下一个"项目应该会带你回到第一个.
图结构通常是循环的; acyclicity是一个特例.例如,考虑一个包含旅行商问题中所有城市和道路的图表.
好的,这是一个特殊的例子.我在科罗拉多州建立了一系列城镇:
V=["Boulder", "Denver", "Colorado Springs", "Pueblo", "Limon"]
Run Code Online (Sandbox Code Playgroud)
然后,我建立了一对连接它们的道路.
E=[["Boulder", "Denver"],
["Denver", "Colorado Springs"],
["Colorado Springs", "Pueblo"],
["Denver", "Limon"],
["Colorado Springs", "Limon"]]
Run Code Online (Sandbox Code Playgroud)
这有一堆循环.例如,您可以从科罗拉多斯普林斯,利蒙,丹佛,然后返回科罗拉多斯普林斯.
如果您创建的数据结构包含V中的所有城市和E中的所有道路,那么这就是图形数据结构.该图表将具有周期.
我最近创建了一个循环数据结构来表示八个基本和有序方向.它对每个方向都有用,可以了解它的邻居.例如,Direction.North知道Direction.NorthEast和Direction.NorthWest是它的邻居.
这是循环的,因为每个neighor知道它的邻居,直到它全速摆动(" - >"表示顺时针):
北 - >东北 - >东 - >东南 - >南 - >西南 - >西 - >西北 - >北 - > ...
注意我们回到了北方.
这允许我做这样的事情(在C#中):
public class Direction
{
...
public IEnumerable<Direction> WithTwoNeighbors
{
get {
yield return this;
yield return this.CounterClockwise;
yield return this.Clockwise;
}
}
}
...
public void TryToMove (Direction dir)
{
dir = dir.WithTwoNeighbors.Where (d => CanMove (d)).First ()
Move (dir);
}
Run Code Online (Sandbox Code Playgroud)
事实证明这非常方便,并且使许多事情变得复杂得多.