我在python中正在编写这个编程问题而且我遇到了一些问题。 问题:取一串数字并将其拆分,插入*和+运算符(或连接一些数字),以便生成的表达式求值为给定数字。如果没有解决方案,请打印“未找到解决方案。
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)。我改变了我的代码:
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”也从“True”变为“False”。谁能告诉我我的错误在哪里?如果可能的话,你能告诉我打印进度字符串的方法吗?更重要的是,我的编程风格可能并不清楚。如果您有任何建议,我很高兴听到!谢谢!
答案 0 :(得分: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)
始终为True !这是因为非空元组总是被认为是真的。
你需要将其拆分出来:
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))
请注意,使用gg == False
测试错误值不会被视为Pythonic。请改用not gg
。
答案 1 :(得分: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))
答案 2 :(得分:0)
感谢abacabadabacaba和Martijn Pieters!我让我的代码工作了。我的代码现在是:
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"
谢谢你们!