从嵌套循环创建递归函数,并沿途进行动态分配

Creating a recursive function from nested loops with dynamic assigns along the way

这让我有点难过,但总而言之,我正在研究一个图形问题,我 'walking' 沿着图形(暂时)计算事物并沿途分配变量。目前,我有一个带有嵌套 for 循环的庞大函数,它肯定可以转换为递归函数。我只是不确定如何。将不胜感激。

MWE

设置

from collections import OrderedDict
from itertools import product

# MWE for SO
D = {"A":(0,1), 'B':(0,1), 'C':(0,1)}
nodes = ['A','B','C']

def assign(assigned, fixed, F):
    for i in nodes:
        if i in fixed:
            assigned[i] = fixed[i]
        else:
            assigned[i] = F[i](assigned)

    return assigned

def func():
    return OrderedDict(
        {
            "A": lambda v: v["A"],
            "B": lambda v: v["B"], 
            "C": lambda v: v["C"],
        }
    )

def func2(past):
    return OrderedDict(
        {
            "A": lambda v: v["A"]^past['A'],
            "B": lambda v: v["B"]^past['B'], 
            "C": lambda v: v["C"]^past['C'],
        }
    )

第一个时间步长(索引)

# First time step
fixed1 = {'B':0}
F = func()
for j in product(*[D[i] for i in D.keys()]):
    assigned = dict(zip(D.keys(), j))
    assigned = assign(assigned, fixed1, F)
    # For each j and assigned some logic happens here

第二个时间步长(索引)

# For second time-step, we start nesting
fixed1 = {'B':0}
fixed2 = {'A':1}
F = func()
# t=0
for j in product(*[D[i] for i in D.keys()]):
    assigned = dict(zip(D.keys(), j))
    assigned = assign(assigned, fixed1, F)
    # For each j and assigned some logic happens here

    # t=1
    G = func2(assigned)
    for jj in product(*[D[i] for i in D.keys()]):
        assigned = dict(zip(D.keys(), jj))
        assigned = assign(assigned, fixed2, G)
        # For each jj and assigned some logic happens here

第三个时间步长(索引)

# For second time-step, we start nesting
fixed1 = {'B':0}
fixed2 = {'A':1}
fixed3 = {'A':1}
F = func()
# t=0
for j in product(*[D[i] for i in D.keys()]):
    assigned = dict(zip(D.keys(), j))
    assigned = assign(assigned, fixed1, F)
    # For each j and assigned some logic happens here

    # t=1
    G = func2(assigned)
    for jj in product(*[D[i] for i in D.keys()]):
        assigned = dict(zip(D.keys(), jj))
        assigned = assign(assigned, fixed2, G)
        # For each jj and assigned some logic happens here

        # t=2
        H = func2(assigned)
        for jjj in product(*[D[i] for i in D.keys()]):
            assigned = dict(zip(D.keys(), jjj))
            assigned = assign(assigned, fixed3, H)
            # For each jjj and assigned some logic happens here

你可以看到这是怎么回事(为清楚起见编辑:对于每个新的时间步长,我需要添加一个新的嵌套循环,这是我想使用递归解决的部分。值得注意的是 fixed 变量将其他变量设置为特定值并来自该模块外部。

因此,如何将其变成递归函数?正如你想象的那样,我要走的远不止三个指数。

编辑:基于评论的新迭代(递归)

这会为所有生成的值调用 fixeds/funcs。

def do_timesteps(fixeds_funcs, assigned=None):
    (fixed, func), *next_fixeds_funcs = fixeds_funcs
    print(fixed, func, assigned)  # for debugging :)
    F = func(assigned)
    for j in product(*[D[i] for i in D.keys()]):
        assigned = dict(zip(D.keys(), j))
        assigned = assign(assigned, fixed, F)
        if next_fixeds_funcs:
            do_timesteps(next_fixeds_funcs, assigned)


def main():
    fixeds_funcs = [
        ({"B": 0}, func),
        ({"A": 1}, func2),
        ({"A": 1}, func2),
    ]
    do_timesteps(fixeds_funcs)