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 chickens
20头和56腿返回8头猪和12头鸡,所以我做了21和62添加一只蜘蛛,但它仍然返回猪和鸡,代码中有什么错误?
谢谢!
答案 0 :(得分:5)
您的代码是正确的 - 在最外面的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
答案 1 :(得分:2)
您的代码完全没有问题。这是一个完全有效的结果。有10只猪和11只鸡,你得到10+11=21
头,10*4 + 11*2
= 62腿。
因此它会返回正确的结果。
现在,如果你将它改为10个头和62个腿,并且还将代码更改为蜘蛛的8条腿,那么你得到的结果是3只猪,1只鸡和6只蜘蛛。
你的代码只是最后尝试蜘蛛,所以你不会得到任何蜘蛛,除非它 是蜘蛛。
答案 2 :(得分:2)
具有2个方程和3个变量的线性系统未被确定 - 对于任何给定的参数集可能存在多个解;对于您正在展示的代码,情况确实如此。代码没有错,如果您想要的是获得尽可能少的蜘蛛的解决方案(如果有的话)。
如果您希望使用尽可能多的蜘蛛获得解决方案(如果有的话),请首先尝试“多个蜘蛛”,例如更改外部循环,现在是
for numSpiders in range(0, numHeads + 1):
即,首先尝试获得一个根本没有蜘蛛的解决方案,然后如果失败尝试使用一个蜘蛛,依此类推:
for numSpiders in reversed(range(0, numHeads + 1)):
反之亦然(这就是reversed
的用途)并首先尝试numHeads
个蜘蛛,然后是numHeads-1
,依此类推。
(你的方程式实际上是丢番图式,即严格基于整数,与普通线性方程相比,它具有重要的意义,它允许分数解,但你的问题与丢番图方程问题无关,只是对于关于欠定线性系统)。