0

我正在尝试遍历一堆可能在它们下面有 uls 的 uls

def go_to_child_ul_and_calculate(child_ul,summary_hash)
  if child_ul.uls.none?
    summary_hash.merge!(child_ul.id => "end of the line")
    eol.push(child_ul.id)
    return eol
  else
    eol = go_to_child_ul_and_calculate(child_ul,summary_hash)
  end
  puts ":"
  return eol
end

我从来没有到过puts。它顺着梯子一直爬到孩子的尽头。然而,当我返回时,它似乎把我推到了一边,而不是返回一层。

来自java世界,我认为函数的返回会返回到eol变量中,但它似乎只是死去并继续。

4

1 回答 1

4

好吧,我会说您的代码存在几个问题:

def go_to_child_ul_and_calculate(child_ul,summary_hash)
  if child_ul.uls.none?
    summary_hash.merge!(child_ul.id => "end of the line")
    # 1. at this point eol is undefined
    eol.push(child_ul.id)
    return eol
  else
    # 2. you define eol here, but you actually call the method
    # recursively again with the same parameters.
    eol = go_to_child_ul_and_calculate(child_ul,summary_hash)
  end
  puts ":"
  return eol
end
  1. 因为 eol 是一个局部变量,它是未定义的,所以这应该抛出一个错误(如果if语句评估为真)
  2. eol 应该是实例变量或通过方法参数提供。如果您使用相同的参数调用它,它并不是真正的递归方法。您可能希望在每个 child_nodes ( child_ul.uls) 上调用它并合并结果。

可能的结果可能如下所示:(尽管我不得不说,递归算法中的变异参数看起来不太好,如果您在实际需要的内容上更简洁,我可以提供不同的方法。)

def go_to_child_ul_and_calculate(child_ul,summary_hash, eol=[])
  if child_ul.uls.none?
    summary_hash.merge!(child_ul.id => "end of the line")
    eol.push(child_ul.id)
    return eol
  else
    child_ul.uls.each do |ul|
      go_to_child_ul_and_calculate(ul,summary_hash, eol)
    end
  end
  puts ":"
  return eol
end
于 2013-05-20T17:10:22.023 回答