def solve(numLegs, numHeads):
for numSpiders in range(0, numHeads + 1):
for numChicks in range(0, numHeads - numSpiders + 1):
numPigs = numHeads - numChicks - numSpiders
totLegs = 4*numPigs + 2*numChicks + 6*numSpiders
if totLegs == numLegs:
return [numPigs, numChicks, numSpiders]
return [None, None, None]
def barnYard(heads, legs):
pigs, chickens, spiders = solve(legs, heads)
if pigs == None:
print "There is no solution."
else:
print 'Number of pigs: ', pigs
print 'Number of Chickens: ', chickens
print 'Number of Spider: ', spiders
barnYard(20,56) # 8 pigs - 12 chickens
barnYard(21,62) # 10 pig - 11 chickens20个头和56条腿返回8头猪和12只鸡,所以我将其设置为21和62来添加一个蜘蛛,但它仍然返回猪和鸡,代码中有什么问题?
谢谢!
发布于 2009-10-15 14:31:35
您的代码是正确的-在最外层的for循环的第一次迭代中,numChicks为0。由于solve在找到有效匹配后立即返回,因此不会尝试另一个可能的有效匹配。
您可以将return语句更改为yield语句,并迭代solve的结果以获得所有可能的组合。
例如:
def solve(numLegs, numHeads):
for numBees in range(0, numHeads + 1):
for numChicks in range(0, numHeads - numBees + 1):
numPigs = numHeads - numChicks - numBees
totLegs = 4*numPigs + 2*numChicks + 6*numBees
if totLegs == numLegs:
yield [numPigs, numChicks, numBees]
def barnYard(heads, legs):
for pigs, chickens, bees in solve(legs, heads):
print 'Number of pigs: ', pigs
print 'Number of chickens: ', chickens
print 'Number of bees: ', bees
barnYard(20,56)将输出:
Number of pigs: 8
Number of chickens: 12
Number of bees: 0
Number of pigs: 6
Number of chickens: 13
Number of bees: 1
Number of pigs: 4
Number of chickens: 14
Number of bees: 2
Number of pigs: 2
Number of chickens: 15
Number of bees: 3
Number of pigs: 0
Number of chickens: 16
Number of bees: 4发布于 2009-10-15 14:28:32
你的代码绝对没有问题。这是一个完全有效的结果。有10头猪和11只鸡,你得到的是10+11=21头,10*4 + 11*2 = 62条腿。
所以它返回一个正确的结果。
现在,如果您将其更改为10个头和62条腿,并且还将代码更改为蜘蛛的8条腿,那么您将得到3头猪,1只鸡和6只蜘蛛。
你的代码只是最后尝试爬虫,所以你不会得到任何蜘蛛,除非它是蜘蛛。
发布于 2009-10-15 14:30:49
具有2个方程和3个变量的线性系统是欠确定的--对于任何给定的参数集,都可能有多个解;对于您所显示的代码,确实是这种情况。如果您想要的是用尽可能少的爬行器获得解决方案(如果有的话),那么代码没有任何错误。
如果你想用尽可能多的爬行器得到解决方案(如果有的话),首先尝试“多个爬行器”,例如更改外部循环,现在是
for numSpiders in range(0, numHeads + 1):也就是说,首先试图得到一个根本没有蜘蛛的解决方案,如果失败了,就尝试一个,以此类推,取而代之的是:
for numSpiders in reversed(range(0, numHeads + 1)):反过来(这就是reversed的作用),它将首先尝试numHeads爬行器,然后是numHeads-1,依此类推。
(您的方程实际上是丢番图方程,即严格基于整数的方程,与允许分数解的普通线性方程相比,这具有重要的影响,但您的问题不限于丢番图方程问题,只是关于欠定线性系统的问题)。
https://stackoverflow.com/questions/1572676
复制相似问题