【问题标题】:loop over parents in multi-level tree structure在多级树结构中循环父级
【发布时间】:2014-05-05 17:33:21
【问题描述】:

我有一个多级树结构,我正在尝试为一个可以有 1-3 个祖先的对象返回一个祖先数组。我有一个工作方法,但是它很复杂,我更喜欢使用循环,有人知道我如何使用 ruby​​ 吗?

def ancestors
  @a = []
  @a.push(parent) if parent.present?
  @a.push(@a.last.parent) if @a.last.parent.present?
  @a.push(@a.last.parent) if @a.last.parent.present?
  return @a
end

【问题讨论】:

  • 认为递归解决方案可能是最干净的
  • 您能举个例子说明我可以如何做到这一点吗? @KarthikT

标签: ruby loops tree


【解决方案1】:

假设我理解你的课程是正确的..我在想这样的事情

def ancestors
   (parent.present? ? [parent, parent.ancestors] :[]).flatten
end

如果 Parent 存在,它返回一个由 parent 及其祖先组成的数组。扁平化是必需的,因为每一层都增加了一个数组层。

题外话。 return 在 ruby​​ 中被认为是不好的风格,除非你需要它,否则这个列表没有必要成为成员变量。

【讨论】:

  • @JeremyRichards :) 很高兴我能帮上忙
【解决方案2】:

这是一个递归的工作。 您需要创建一个调用自身的函数。 像这样的......

def ancestors 
  if self.parent.present?
    ancestors << self.parent.ancestors
  else
    return self
  end
end

【讨论】:

  • 这正是我所需要的,我不断收到“SystemStackError:堆栈级别太深”。我无法让它正常工作你知道我可能哪里出错了吗?
  • 检查您的退出条件。您必须始终找到一种方法来展开堆栈。退出条件是任何递归解决方案中最重要的部分。
  • 错误是因为ancestors调用ancestors,在其自身
【解决方案3】:

用迭代也很简单,你可以试试

def ancestors
  @a = []
  anc=parent
  while anc.present? do
    @a.push anc
    anc=anc.parent
  end
  return @a
end

(没试过,因为我没有你的数据结构)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多