0

我在确定一个函数的实现时遇到了一些问题。

基本上,我有一个嵌套列表,我需要像这样显示它们:

Root 
  -RItem1
      --Item1
      --RRItem2
         --Item1
         --Item2
  -RItem2
      --RRItem1
          -Item1
          -Item2
      --Item2

请注意,我将在运行时获取数据。一个项目可能有一个项目,一个项目有一个项目,等等。

所以基本上,一个人将如何编程呢?我知道递归函数是要走的路,但我遇到了麻烦。具体来说,我很难考虑我的物品的坐标。

这是一个实现问题,所以语言并不重要。

4

3 回答 3

3

递归函数是一个好方法。您必须将“级别”作为参数传递。类似的东西(伪Java/Javascript):

function display(item, level) {
   printlnAtLevel(level,item.name)
   if item.hasChildren() {
      foreach(child : item.children) {
          display(child,level+1)
      }
   }
}
display(root,0)
于 2013-04-28T12:11:00.770 回答
1

我用 (x,y) 发布另一个答案:

 function display(item, x, y) {
  print(x,y,item.name)
  if item.hasChildren() {
    yTemp = y + 1 
    foreach(child : item.children) {
      display(child,x+1,yTemp++)
   }
  }
 }
 display(root,0,0)
于 2013-04-28T13:33:02.950 回答
1
def nodePrint(val,depth):
  print(" "*depth + "-"*depth,val)

def recPrint(l,depth=0):
    #node has no children A) it contains 1 or 0 elements B) if not A then'child' is string
    if len(l) <= 1 or isinstance(l[1],str):
      for value in l:
        nodePrint(value,depth)
    else:
      #node had both head and child in form [ head, [ child1, ... ] ]
      head, children = l[0],l[1:]
      nodePrint(head,depth)
      for child in children:
        recPrint(child,depth+1)  

使用以下内容:

t = ["Root",
     [
      "Ritem1",
            [
              "Item1",
               [
               ]
            ],
            [
              "RRItem2",
              [
                "Item1",
                "Item2"
              ]
            ]
     ],
     ["Ritem1",
       [
         "RRItem1",
         [
          "Item1",
          "Item2"
          ]
       ],
       ["Item2"]
     ]
    ]

recPrint(t,depth=0)

产生(与您要求的相同)

>>> 
 Root
 - Ritem1
  -- Item1
  -- RRItem2
   --- Item1
   --- Item2
 - Ritem1
  -- RRItem1
   --- Item1
   --- Item2
  -- Item2
于 2013-04-28T14:19:29.310 回答