2016-09-23 67 views
0

該函數做我想做的事情,但是當它完成時,它只是坐在那裏,而不是從我稱之爲的地方繼續,我無法弄清楚爲什麼。該代碼是:Python函數卡住了(沒有錯誤),但我不明白爲什麼

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") 

我已經把在我希望它結束​​,但據我所知它不應該真正需要它的回報。

任何人都可以看到我做了什麼導致它卡住?

感謝

+1

如果它卡住了,它不會做你想要的。每次遞歸都需要一個基本情況,它返回一個基本值,以及一個遞歸部分,其中實際函數調用是在return語句中進行的。你的功能不這樣做。 (return recursion(z + 1)) –

+2

定義了哪個'n'? – dg99

+0

@ dg99:和't',和'm1'和'm2' ...這段代碼很瘋狂!它看起來像是一個POCC(Python混淆代碼競賽)的入口。 – rodrigo

回答

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) 
+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) 
+0

出於好奇,這段代碼應該做什麼?當我嘗試運行它時,它看起來像是一個無限循環(一旦我解決了名稱錯誤)。 – mwchase

+0

我認爲我發佈的版本可能是老實說,我一直在爲它奮鬥了很多年。它應該會產生每一個可能的狀態,一個x的網格可能會以n的數量爲1,其餘的爲0.我後來意識到我只是將它輸出爲一行,因此大大簡化了它,我會用它更新後現在你感興趣了。 –

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") 

通過使用列表和範圍對象可以使這更清晰,但這需要付出努力。

相關問題