如何简化这些嵌套的for循环?

时间:2020-03-31 21:58:40

标签: python-3.x

给我这个谜语:

enter image description here

我的第一个想法是使用python解决它。 (后来我意识到代数会容易得多。)

这是我的初始代码:

a = 0
b = 0
c = 0
d = 0

for a in range(100):
    for b in range(100):
        for c in range(100):
            for d in range(100):

                if float(a + b)/4 == 8.0:
                    if float(a + c)/4 == 13.0:
                        if float(c - d)/4 == 6.0:
                            if float(b + d)/4 == 8.0:
                                print(float(a + b)/4, end=" ")
                                print(float(a + c)/4, end=" ")
                                print(float(c + -d)/4, end=" ")
                                print(float(b + d)/4, end=" and values are:")
                                print(a/4, end=" ")
                                print(b/4, end=" ")
                                print(c/4, end=" ")
                                print(d/4)

它起作用了,但是显然这不是很可读。 查看堆栈溢出会导致解决方案成为递归函数,但是我不知道如何精确地应用它,因为存在四种不同的数学计算。

例如,这是我最初尝试的内容:

val = [0, 0, 0, 0]

def recursive_solution(section):
    for val[section] in range(100):
        for val[section+1] in range(100):
            if section == 0:
                if float(val[section])/4 + float(val[section + 1])/4 == 8:
                    recursive_solution(1)


recursive_solution(0)

但是这显然不起作用,因为第二个索引被添加到了第四索引,并且其中一个操作是减法,并且您不能将第四个索引添加到第五个索引,因为第五个索引没有存在。

1 个答案:

答案 0 :(得分:0)

这就是我要从您的代码中执行的操作:使用笛卡尔productand语句:

from collections import product
for a, b, c, d in product(*([range(100)] * 4))
    if (
        float(a + b) / 4 == 8.0
        and float(a + c) / 4 == 13.0
        and float(c - d) / 4 == 6.0
        and float(b + d) / 4 == 8.0
    ):
        print(float(a + b) / 4, end=" ")
        print(float(a + c) / 4, end=" ")
        print(float(c + -d) / 4, end=" ")
        print(float(b + d) / 4, end=" and values are:")
        print(a / 4, end=" ")
        print(b / 4, end=" ")
        print(c / 4, end=" ")
        print(d / 4)