1 回答
TA贡献1789条经验 获得超8个赞
由于您的系谱图中可以有循环,因此您可能会陷入这样的循环。这意味着您必须检测循环并停止在那里构建。你可以通过稍微改变你的树来做到这一点。
首先,您tree按值传递对象,但附加指向它的指针。将指针传递给周围的树:
func walk(t *tree, written map[int]int, writer io.Writer) *tree {
}
更好的方法可能是:
func (t *tree) walk(written map[int]int, writer io.Writer) {...}
您还应该将 a 添加*parent到树中,以便检测循环:
type tree struct {
parent *tree
sire *tree
dam *tree
animal int
base int
path []int
}
每次创建新关卡时,适当设置父级:
myTree := newTree(t.sire.animal, pedigree[t.sire.animal][0], pedigree[t.dam.animal][1], t.base)
myTree.parent=t
myTree.walk(written, writer)
然后添加一个函数来测试你是否进入循环:
func (t *tree) loop(animal int) bool {
for t!=nil {
if t.animal==animal {
return true
}
t=t.parent
}
return false
}
并检查您是否正在进入循环:
if !myTree.loop(myTree.animal) {
myTree.walk(written, writer)
}
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报