计算任意嵌套列表列表中的所有元素,不进行递归

Ver*_*int 14 python iteration recursion

我刚刚学习了Python中的递归并完成了分配,其中一个是计算任意嵌套列表列表中的所有元素.我搜索过这个网站,发现答案似乎都使​​用了递归调用.由于已经教导过任何可以递归表达的东西都可以迭代表达,迭代在Python中是首选,如果没有Python 2.6中的递归或导入模块(作为学习练习),如何实现呢?(嵌套列表本身将被视为元素,其内容也将被计为.)例如:

>>> def element_count(p):
...     count = 0
...     for entry in p:
...         count += 1
...         if isinstance(entry, list):            
...             count += element_count(entry)
...     return count
>>> print element_count([1, [], 3]) 
3 
>>> print element_count([1, [1, 2, [3, 4]]])
7
>>> print element_count([[[[[[[[1, 2, 3]]]]]]]])
10
Run Code Online (Sandbox Code Playgroud)

如何使用迭代编写?

NPE*_*NPE 17

这是一种方法:

def element_count(p):
  q = p[:]
  count = 0
  while q:
    entry = q.pop()
    if isinstance(entry, list):
      q += entry
    count += 1
  return count

print element_count([1, [], 3]) 
print element_count([1, [1, 2, [3, 4]]])
print element_count([[[[[[[[1, 2, 3]]]]]]]])
Run Code Online (Sandbox Code Playgroud)

代码维护着要查看的事物队列.每当循环遇到子列表时,它就会将其内容添加到队列中.

  • 由于Python的内置递归限制,实际上*通常是一个好主意,将递归算法实现为具有显式堆栈的迭代算法.我正在考虑,例如,DFS和类似的图算法,它将超过除最小问题之外的所有递归限制. (4认同)
  • 这个功能具有破坏性.它将修改传递给它的列表. (3认同)
  • @NoufalIbrahim:公平点.代码已更新. (2认同)

mat*_*ata 10

通常,每个递归问题都可以通过使用堆栈以某种方式转换为迭代,在本例中为list:

def element_count(p):
    elements = list(p)
    count = 0
    while elements:
        entry = elements.pop()
        count += 1
        if isinstance(entry, list):
            elements.extend(entry)
    return count
Run Code Online (Sandbox Code Playgroud)