我需要一个我称之为shake_tree
的操作。我使用递归算法实现它,只使用基本的 ruby-Fortran (引用旧引用“你可以用任何语言编写 Fortran 代码。),但我怀疑有一个更简洁和惯用的 ruby 方式。
由于我不知道此操作的常用名称,让我简要描述一下。我有一个像这个例子的散列哈希:
{
"-cutoff:" =>
{
:flag => {:set_ie1 => [:useCutoff, true]},
:arg => {:vector_ie1 => :double}
},
"-depth:" =>
{
:flag => {:set_ie2 => [:useInconsistent, true]},
:arg => :double,
:default => 2.0
},
"-maxclust:" =>
{
:flag => {:set_ie3 => [:useCutoff, false]},
:arg => {:vector_ie2 => :index}
},
:fn => "arrayTypeOptions"
}
在树的结构中嵌入了:vector_ie1
和:set_ie3
等唯一符号。除了使用符号从根到离开的路径之外,我需要删除树的所有分支。鉴于上面的例子:
shake_tree(specs, :vector_ie1)
将返回:
{
"-cutoff:" =>
{
:flag => {:set_ie1 => [:useCutoff, true]},
:arg => {:vector_ie1 => :double}
}
}
和
shake_tree(specs, :set_ie2)
将返回:
{
"-depth:" =>
{
:flag => {:set_ie2 => [:useInconsistent, true]},
:arg => :double,
:default => 2.0
}
}
经验丰富的 ruby 编码器如何处理此任务?
答案 0 :(得分:1)
这是我的递归实现。我决定将其称为shake_tree
以使 RubyMine 的拼写检查程序感到满意(因为我喜欢shake_tree specs key
的声音):
def shake_tree(specs, key)
parent = find_parent(specs, key)
parent ? { parent => specs[parent] } : nil
end
def find_parent(specs, key, keypath = [])
specs.each do |k, v|
if k == key
return (keypath + [k])[0]
elsif v.is_a?(Hash)
branch = find_parent(v, key, keypath + [k])
if !branch.nil?
return branch
end
end
end
nil
end
这将完全返回上面指定的输出。
我仍然很想知道这是否有一个共同的名字。