python - Python递归列表理解到迭代方法
问题描述
我试图了解如何迭代地思考递归方法。例如,我有以下回溯方法:
def bitStr(n, s):
if n == 1:
return s
return [digit + bits for digit in bitStr(1, s) for bits in bitStr(n - 1, s)]
我正在练习如何使用双 for 循环以迭代方式或显式方式完成类似的操作。
我开始了这样的事情,我理解这是不正确的;但是,无法修复它:
def bitStr2(n, s):
if n == 1:
return [c for c in s]
for bits in bitStr2(n - 1, s):
for digit in bitStr2(1, s):
return digit + bits
谢谢你
解决方案
您的代码中有两个问题。
首先,正如@MisterMiyagi 所指出的,您切换了循环。在列表推导中,循环是从左到右读取的。您应该像这样编写常规循环:
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
...
其次,列表推导产生……一个列表。您必须将元素存储在列表中:
...
result = []
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
result.append(digit + bits)
return result
(相反:如果您不想生成列表,则永远不要使用列表推导式。)而且您不必以不同的方式处理这种n = 1
情况。完整代码:
def bitStr2(n, s):
if n == 1:
return s
result = []
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
result.append(digit + bits)
return result
注意for digit in bitStr(1, s)
相当于for digit in s
。我不明白为什么bitStr
在这种情况下调用该方法,因为您已经知道结果。
推荐阅读
- javascript - VueJS:如何从组件外部访问 prop 默认值?
- ruby-on-rails - 访问视图中的哈希时Rails未定义的方法
- django - 在 Django 视图中获取 IntegrityError 消息
- drools - Optaplanner:java.lang.NoSuchMethodError:com.google.common.collect.MapMaker.makeComputingMap
- sql - SQL比较2个日期并在> 3天时显示在表中
- bash - ssh-keygen 期望在 1 个命令行中,没有密码
- amazon-web-services - 为什么 S3 不触发 Lambda 函数?
- bash - 将一个目录中的csv的第二行复制到另一个目录中的csv
- javascript - npm 安装
- json - 获取 JSON 数据数组中的最后一个字段