Python函数卡住(没有错误),但我无法理解为什么

时间:2016-09-23 20:53:33

标签: python python-3.x

该功能完成了我想要的功能,但是当它完成时它只是坐在那里而不是从我调用的地方继续,我无法弄清楚原因。代码是:

x = 9
y = 9
n = 10
ty = 1
tx = 1

while ty <= y:
    while tx <= x:
        vars()["p" + str(ty) + str(tx)] = 0
        tx += 1
    ty += 1
    tx = 1

tn = 1
while tn <= n:
    vars()["m" + str(tn)] = tn
    tn += 1

t = x * y
tm = n
def recursion(z):
    global tm
    if z < n:
        for x in range(n):
            recursion(z + 1)
    else:
        if tm > 0:
            tv = "m" + str(tm)
            otm = eval(tv)
            while eval(tv) < t - n + tm:
                vars()[tv] = eval(tv) + 1
                print(tv + " = " + str(eval(tv)))
            vars()[tv] = otm + 1
            print(tv + " = " + str(eval(tv)))
            if tm > 1:
                vars()["m" + str(tm - 1)] = eval("m" + str(tm - 1)) + 1
                print(str("m" + str(tm - 1) + " = " + str(eval("m" + str(tm -1)))))
            tm -= 1

recursion(1)

print("done")

我把回报放在我期望它结束的地方,但据我所知它实际上并不需要它。

任何人都可以看到我做了什么导致它被卡住了吗?

由于

3 个答案:

答案 0 :(得分:0)

我无法弄清楚发生了什么(事实证明,如果我离开它几分钟它实际上会完成),相反,我意识到我不需要使用递归来实现我想要的(而且我也意识到这个功能并没有真正做我想做的事情。)

对于任何有兴趣的人,我简化并重写它为一些while循环:

x = 9
y = 9
t = x * y
n = 10

tt = 1
while tt <= t:
        vars()["p" + str(tt)] = 0
        tt += 1

tn = 1
while tn <= n:
    vars()["m" + str(tn)] = tn
    vars()["p" + str(tn)] = 1
    tn += 1

def cl():
    w = ""
    tt = 1
    while tt <= t:
        w = w + str(eval("p" + str(tt)))
        tt += 1
    p.append(w)

tm = n
tv = "m" + str(tm)
p = []
while m1 < t - n + tm - 1:    
    cl()
    while tm == n and eval(tv) < t - n + tm:
        vars()["p" + str(eval(tv))] = 0
        vars()[tv] = eval(tv) + 1
        vars()["p" + str(eval(tv))] = 1
        cl()        
    tm -= 1
    tv = "m" + str(tm)
    while tm < n and tm > 0:
        if eval(tv) < t - n + tm:
            vars()["p" + str(eval(tv))] = 0
            vars()[tv] = eval(tv) + 1
            vars()["p" + str(eval(tv))] = 1
            while tm < n:
                tm += 1
                ptv = tv
                tv = "m" + str(tm)
                vars()["p" + str(eval(tv))] = 0
                vars()[tv] = eval(ptv) + 1
                vars()["p" + str(eval(tv))] = 1
        else:
            tm -= 1
            tv = "m" + str(tm)

答案 1 :(得分:0)

如果有人对原始代码的作用感兴趣,我重新安排条件以修剪函数调用树:

x = 9
y = 9
n = 10
ty = 1
tx = 1

while ty <= y:
    while tx <= x:
        vars()["p" + str(ty) + str(tx)] = 0
        tx += 1
    ty += 1
    tx = 1

tn = 1
while tn <= n:
    vars()["m" + str(tn)] = tn
    tn += 1

t = x * y
tm = n
def recursion(z):
    global tm
    if tm > 0:
        if z < n:
            for x in range(n):
                recursion(z + 1)
        else:
            tv = "m" + str(tm)
            otm = eval(tv)
            while eval(tv) < t - n + tm:
                vars()[tv] = eval(tv) + 1
                print(tv + " = " + str(eval(tv)))
            vars()[tv] = otm + 1
            print(tv + " = " + str(eval(tv)))
            if tm > 1:
                vars()["m" + str(tm - 1)] = eval("m" + str(tm - 1)) + 1
                print(str("m" + str(tm - 1) + " = " + str(eval("m" + str(tm -1)))))
            tm -= 1

recursion(1)

print("done")

通过使用列表和范围对象可以使这更加清晰,但这需要付出努力。

答案 2 :(得分:0)

请注意,人们没有浏览更改历史记录:这是基于对其他答案的评论。更新:更好的版本。

import itertools

def permutations(on, total):
    all_indices = range(total)
    for indices in itertools.combinations(all_indices, on):
        board = ['0'] * total
        for index in indices:
            board[index] = '1'
        yield ''.join(board)