如何定义包含for循环的迭代函数,其中迭代器i,j,l。。也用于定义的迭代函数中

2024-04-20 04:48:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用递归函数来简化下面的“for循环”,对于任何数量的循环,我可能需要根据需求运行程序。我可以定义一个递归函数而不用I,j,k,l。。。。但是我不知道或者我很难用I,j,k来定义一个迭代函数。。。 如果有人能帮我想象一下,我会很高兴的。你知道吗

adjcent_spin_product_matrix = []
z_partial = 0
spin = [-1, 1]
for i in spin:
    for j in spin:
        for k in spin:
            for l in spin:
               for m in spin:
                   for o in spin:
                       for p in spin:
                           adjcent_spin_product_matrix = adjcent_spin_product_matrix + [i*j+ j*k+ k*l+ l*n+ m*o+ o*p]

Tags: 函数in程序for数量定义productpartial
3条回答

不需要特别的递归函数。你知道吗

如果使用itertools.product,则可以对每个索引数使用单个循环;也可以使用sumzip简化计算

from itertools import product
...
spin_products = []
n = int(input('how many indices? '))
...
for indices in product([-1, 1], repeat=n):
    spin_products.append(sum(i*j for i, j in zip(indices, indices[1:])))

如果不想使用递归函数来实现这一点,那么可以使用stack。将循环的每一级推到堆栈中,以便以后可以将它们弹出。你知道吗

堆栈是大多数语言中的基本数据结构,因为它是存储函数调用上下文的一种非常自然的方式,也是堆栈溢出的由来。你知道吗

我之前的回答是反对你未经编辑的帖子,所以这里有一个更新:

根据您提供的代码,很明显您必须至少有ij的循环。你知道吗

单独评估该循环会得到以下列表: [1, -1, -1, 1]

现在,代码中的每个后续嵌套循环只会复制此列表中的每个元素,然后添加上一个循环中的数组(重复两次):

i、j和k循环给出[1, 1, -1, -1, -1, -1, 1, 1] + [1, -1, -1, 1, 1, -1, -1, 1] = [2, 0, -2, 0, 0, -2, 0, 2]

i、j、k和l循环给出[1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1] + [1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1] + [1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1] = [3, 1, -1, 1, -1, -3, -1, 1, 1, -1, -3, -1, 1, -1, 1, 3]

等等。。。你知道吗

因此,您可以简单地尝试以下操作:

adjacent_spin_product_matrix = []
ij_result = [1, -1, -1, 1]

def calc_product(adjacent_spin_product_matrix, number_of_indices):
    if number_of_indices == 2:
        return ij_result
    else:
        number_of_duplicates = 2 ** (number_of_indices - 2)
        curr_array = []
        for elem in ij_result:
            for dup in range(number_of_duplicates):
                curr_array.append(elem)
        prev_array = calc_product(adjacent_spin_product_matrix, number_of_indices - 1)
        temp_array = []
        temp_array.extend(prev_array)
        temp_array.extend(prev_array)
        result = []
        for i, elem in enumerate(curr_array):
            result.append(elem + temp_array[i])

        return result

现在,你应该发现:

print(calc_product([], 2))  # equivalent to i and j case
print(calc_product([], 3))  # equivalent to i, j, and k case
print(calc_product([], 4))  # equivalent to i, j, k, and l case
print(calc_product([], 5))  # equivalent to i, j, k, l, and m case
print(calc_product([], 6))  # equivalent to i, j, k, l, m, and o case
print(calc_product([], 7))  # equivalent to i, j, k, l, m, o, and p case

它们给出了预期的结果:

[1, -1, -1, 1]
[2, 0, -2, 0, 0, -2, 0, 2]
[3, 1, -1, 1, -1, -3, -1, 1, 1, -1, -3, -1, 1, -1, 1, 3]
[4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4]
[5, 3, 1, 3, 1, -1, 1, 3, 1, -1, -3, -1, 1, -1, 1, 3, 1, -1, -3, -1, -3, -5, -3, -1, 1, -1, -3, -1, 1, -1, 1, 3, 3, 1, -1, 1, -1, -3, -1, 1, -1, -3, -5, -3, -1, -3, -1, 1, 3, 1, -1, 1, -1, -3, -1, 1, 3, 1, -1, 1, 3, 1, 3, 5]
[6, 4, 2, 4, 2, 0, 2, 4, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, -2, -4, -6, -4, -2, -4, -2, 0, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 0, -2, -4, -2, -4, -6, -4, -2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 4, 2, 0, 2, 4, 2, 4, 6]

相关问题 更多 >