【问题标题】:recursion function recurring too often递归函数经常重复
【发布时间】:2021-11-06 23:58:11
【问题描述】:

在我的 python 旅程和一般编码中相对较早。我遇到了一个示例问题,该问题要求将列表列表展平。现在我不知道有多少列表列表。这导致我进行第一次递归尝试:

array = [[1,2,3,['a','b','c'],4],'d', [5,6],[7],8,9]
flattened = []

def flattenme (iteritem):
    
    for item in iteritem:
        if isinstance(item, Iterable) or isinstance(item, (str,bytes)):
            flattenme(item)
        else:
            flattened.append(item)

当我运行它时

print(f"flatten method: {list(flattenme(array))}")

我得到错误:

RecursionError: 比较中超出了最大递归深度

不应该

flattenme(item)

在最后一次调用时只返回非列表项?我不确定出了什么问题以及我对递归的理解失败的地方。

【问题讨论】:

  • 如果项目是一个字符串,你应该附加它。不再调用该函数...
  • 字符串在迭代时会产生更小的字符串。如果你提供一个字符串,那么你永远不会到达“底部”。 Python 没有 char 类型。
  • 括号太多。代码根本不运行
  • flattened 未定义。
  • 该方法不返回任何内容,因此无法打印。

标签: python recursion


【解决方案1】:

字符串和字节是可迭代的。具体来说,字符串在迭代时会产生长度为 1 的字符串。

这意味着你的代码会无限递归。

此外,您的函数不会返回任何内容。

这是我的建议,它使 flattenme 成为不拆分字符串的生成器:

array = [[1,2,3,['a','b','c'],4],'d', [5,6],[7],8,9]

def flattenme (iteritem):
    for item in iteritem:
        if isinstance(item, Iterable) and not isinstance(item, (str,bytes)):
            yield from flattenme(item)
        else:
            yield item

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2014-06-03
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2015-03-04
    相关资源
    最近更新 更多