2014-09-20 102 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