我正在尝试将算法从 Python 移植到 Go。它的中心部分是使用 dicts 构建的树,它应该保持这种方式,因为每个节点可以有任意数量的子节点。所有叶子都在同一级别,因此最低级别的字典包含其他字典,而最低级别的包含浮点数。像这样:
tree = {}
insert(tree, ['a', 'b'], 1.0)
print tree['a']['b']
因此,在尝试将代码移植到 Go 并同时学习语言时,我开始测试基本思想:
func main() {
tree := make(map[string]interface{})
tree["a"] = make(map[string]float32)
tree["a"].(map[string]float32)["b"] = 1.0
fmt.Println(tree["a"].(map[string]float32)["b"])
}
这按预期工作,因此下一步是将其变成一个例程,该例程将采用“树”、路径和值。我选择了递归方法并想出了这个:
func insert(tree map[string]interface{}, path []string, value float32) {
node := path[0]
l := len(path)
switch {
case l > 1:
if _, ok := tree[node]; !ok {
if l > 2 {
tree[node] = make(map[string]interface{})
} else {
tree[node] = make(map[string]float32)
}
}
insert(tree[node], path[1:], value) //recursion
case l == 1:
leaf := tree
leaf[node] = value
}
}
这就是我想象的例程应该如何结构化,但我无法让标有“递归”的行工作。如果我尝试对tree[node]
. 这样做的正确方法是什么?