Ruby帮助我应该如何递归显示这些数据?

问题描述

因此,我想从中学到的数据看起来与我发布的内容相似。为了简化解释我的需求,我将说我试图从数组中的每个项目中提取ID,然后从数组中该对象的值中提取每个ID。等等等等。我已经尝试了很多方法来实现此目的,但是我对解决方案的实际效果并不了解。我对递归还不满意,但是这似乎是一种缺乏知识的情况。请让我知道是否需要更多信息,但我的主要目的是弄清楚如何按父级顺序访问这些数据。

    objects = [
  {
    id: 100,values: [
      {
        id: 101,values: [
          {
            id: 103,values: [],last: true,parent: 101
          }
        ],last: false,parent: 100
      },obj_c: {
        id: 102,values: [
          {
            id: 104,values: [
              {
                id: 105,parent: 104
              }
            ],parent: 102
          }
        ],parent: 100
      }
    ],parent: nil
  },{
    id: 106,values: [
      {
        id: 107,values: [
          {
            id: 110,parent: 107
          }
        ],parent: 106
      },{
        id: 108,values: [
          {
            id: 109,parent: 108
          }
        ],parent: 106
      }
    ],parent: nil
  }
]

因此,使用该示例数据,我想知道如何使它看起来像这样:

100
    101
        103
    102
        104
            105


106
    107
        110
    108
        109

因此,即使我只是想知道如何以这种方式将其打印到控制台上,并带有适当的空白量以指示每块来自哪个父ID,也可以解决我的问题。 但是希望这有助于表明我正在尝试实现的目标。预先感谢您提供有关如何解决此问题的建议。

解决方法

这是递归问题。您可以使用递归函数/方法调用(隐式使用堆栈)或显式堆栈数据结构来解决它。

以下是使用递归调用解决问题的方法:

def print_object(object,depth)
  print " " * depth
  puts object[:id]
  object[:values].each do |o|
    print_object(o,depth + 1)
  end if object[:values]
end

objects.each do |object|
  print_object(object,0)
end

在编写递归解决方案时,请始终考虑: 1-初始状态。 2-终止状态。 3-递归模式。

因此,在此示例中,我决定将递归地打印出具有更大空间的结果,以用于更深层次的(depth + 1) # recursive pattern,并且将从开头的0 # initial state空格开始,当不再有object[:values] # termination state时,我将停止/返回。