如何实现树振动器操作?

时间:2013-04-26 01:26:27

标签: ruby recursion hashmap recursive-datastructures

我需要一个我称之为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​​ 编码器如何处理此任务?

1 个答案:

答案 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

这将完全返回上面指定的输出。

我仍然很想知道这是否有一个共同的名字。