【问题标题】:Simplifying nested for loops简化嵌套的 for 循环
【发布时间】:2021-09-20 20:11:21
【问题描述】:

我正在寻找一种更短(可能是递归)的方式来编写以下内容:

for x1 in range(10):
    for x2 in range(10 - x1):
        for x3 in range(10 - (x1 + x2)):
            for x4 in range(10 - (x1 + x2 + x3)):
                print(x1,x2,x3,x4)

提前致谢。

【问题讨论】:

标签: python recursion syntax


【解决方案1】:

您想要的是过滤后的产品。为此使用itertools,无需递归。

from itertools import product

n=10
for x1, x2, x3, x4 in filter(lambda x: sum(x) < n, product(range(n), repeat=4)):
    print(x1, x2, x3, x4)

输出:

0 0 0 0
0 0 0 1
0 0 0 2
0 0 0 3
0 0 0 4
0 0 0 5
0 0 0 6
0 0 0 7
0 0 0 8
0 0 0 9
0 0 1 0
...
9 0 0 0

【讨论】:

  • 你是不是忘记了一些可能性? combinations_with_replacement保留顺序,你应该使用product:你可以有0001但不能有1000
  • @cards 是的,它实际上是一个产品,有 10**4 种可能性,我更正了答案
  • 但我认为这仍然不够,假设索引空间固定大小为 10,有 10**4 种可能性,但它减少了,所以应该过滤这样的产品
  • 我没有得到你的最后一点
  • 例如使用你的代码你会得到:if (x1, x2, x3, x4) == (3, 9, 9, 9): print('not possible!!') 但是这个元组不应该存在于原始问题中
【解决方案2】:

这里有一些提示可以帮助您前进,如果您遇到困难,您可以提出更尖锐的问题:要找到递归公式,首先对您想要实现的目标进行高级描述,然后看看您是否可以确定问题的递归性质。为此,您可能需要概括您的问题。

那么,让我以具体的形式对您的问题进行高级描述:

“打印出所有非负数的 4 元组,使得它们的总和为 4。”

我将其概括为

“打印出所有非负数的 n 元组,使得它们的和为 k。”

现在试试你是否可以递归地解决这个任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2012-06-23
    • 1970-01-01
    • 2020-01-14
    • 2015-01-15
    • 2020-08-24
    • 2020-07-06
    相关资源
    最近更新 更多