2014-09-20 103 views
1

我在python中做這個編程問題,我有一些問題。 問題:取一串數字並將其分開,插入*和+運算符(或連接一些數字),以便得到的表達式計算爲給定的數字。如果沒有解決方案,打印「無解發現python:bug返回布爾值和字符串在一起

解決方案1:

def findResult(s, goal): 

    i = 1 
    gg = False 
    while gg ==False and i < len(s)+1: 
     if int(s) == goal: 
      gg = True 
      return True 

     num = int(s[0:i]) 
     if goal % num == 0: 
      gg = findResult(s[i:len(s)], goal/num) or findResult(s[i:len(s)], goal - num) 
     else: 
      gg = findResult(s[i:len(s)], goal - num) 
     i += 1 

    return gg 

ss = '12345' 
goal = 691 
print findResult(ss, goal) 

當我測試此代碼,它會告訴我們,如果字符串可以計入進球數(TRUE或FALSE)然後。我想返回的計算進度(1 + 2 * 345),我改變了這樣的代碼:

解決方案2:

def findResult(s, goal, prog): 
    i = 1 
    gg = False 
    while gg ==False and i < len(s)+1: 

     if int(s) == goal: 
      gg = True 
      prog += s 
      return (True,prog) 
     else: 
      num = int(s[0:i]) 
      if goal%num == 0: 
       gg,prog = findResult(s[i:len(s)], goal/num,prog+"*"+str(num)) or findResult(s[i:len(s)], goal - num,prog+"+"+str(num)) 
      else: 
       gg,prog = findResult(s[i:len(s)], goal - num,prog+"+"+str(num)) 
     i += 1 

    return (gg,prog) 

ss = '12345' 
goal = 691 
print findResult(ss, goal,"") 

這段代碼的輸出是錯的,什麼是我不能明白的是, 「gg」也從「真」變爲「假」。誰能告訴我我的錯誤在哪裏?如果可能,你能告訴我一種打印進度字符串的方法嗎?更重要的是,我的編程風格可能並不清晰。如果您有任何建議,我很高興聽到!謝謝!

+0

你的第二次嘗試的輸出是什麼? – Kasramvd 2014-09-20 19:19:27

+0

(假,* 1 + 2 + 3 + 4 + 5 + 45 + 34 * 5 + 345 + 23 * 4 + 5 + 45 + 234 + 5 + 2345 + 12 + 3 * 4 + 5 + 45 + 34 * 5 + 345 + 123 * 4 + 5 + 45 + 1234 + 5 + 12345') – user3329412 2014-09-20 20:09:38

回答

1

你的版本依賴於findResult()返回值返回只是一個布爾這裏:

gg,prog = findResult(s[i:len(s)], goal/num,prog+"*"+str(num)) or findResult(s[i:len(s)], goal - num,prog+"+"+str(num)) 

注意or在表達; (False, somestring)(True, somestring)永遠爲真!那是因爲一個非空元組總是被認爲是真的。

你需要拆分出來:

if goal%num == 0: 
    gg,prog = findResult(s[i:len(s)], goal/num,prog+"*"+str(num)) 
    if not gg: 
     gg, prog = findResult(s[i:len(s)], goal - num,prog+"+"+str(num)) 

注意,它不考慮Python的使用gg == False來測試假值。改爲使用not gg

+0

非常感謝。我按照你所說的去嘗試。有效!現在我的代碼運行良好! – user3329412 2014-09-20 20:08:00

+0

@ user3329412考慮[接受答案](http://meta.stackexchange.com/a/5235/215829)如果它解決了您的問題... – 2014-09-20 20:34:44

1

我認爲問題就出在這行:

gg,prog = findResult(s[i:len(s)], goal/num,prog+"*"+str(num)) or findResult(s[i:len(s)], goal - num,prog+"+"+str(num)) 

在這裏,你在元組使用or操作。但是,非空元組總是在布爾上下文中計算爲True。你應該寫這樣的代替:

gg,prog = findResult(s[i:len(s)], goal/num,prog+"*"+str(num)) 
if gg == False: 
    gg,prog = findResult(s[i:len(s)], goal - num,prog+"+"+str(num)) 
+0

謝謝!這纔是重點。我的代碼正在工作! – user3329412 2014-09-20 20:08:38

0

感謝abacabadabacaba和Martijn彼得斯!我讓我的代碼工作。我的代碼是現在:

def findResult(s, goal, prog): 
    i = 1 
    gg = False 
    while gg ==False and i < len(s)+1: 

     if int(s) == goal: 
      gg = True 
      prog += s 
      return (True,prog) 

     num = int(s[0:i]) 
     if goal%num == 0: 
      gg,prog = findResult(s[i:len(s)], goal/num,prog+str(num)+"*") 
      if gg == False: 
       gg,prog =findResult(s[i:len(s)], goal - num,prog+str(num)+"+") 
     else: 
      gg,prog = findResult(s[i:len(s)], goal - num,prog+str(num)+"+") 
     i += 1 
    if gg == True: 
     return (gg,prog) 
    else: 
     return (gg,"") 

ss = '12345' 
goal = 691 
gg,result = findResult(ss, goal,"") 
result += "=" + str(goal) 
print result if gg else "No solution" 

謝謝你們!

+0

好吧,我的方法是錯誤的。但是發佈代碼的問題已解決。感謝你們。 – user3329412 2014-09-23 01:51:21