2009-10-15 44 views
0
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,但它仍然返回豬和雞,代碼中出現了什麼錯誤?一個簡單的例子中的意外結果

謝謝!

+1

倒不是說在你的代碼中的錯誤,但蜘蛛有八條腿:) – 2009-10-15 14:25:49

回答

5

您的代碼是正確的 - 在最外面的for循環的第一次迭代中,numChicks0。由於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 
+0

產量是一個好主意,這將是教育。 +1 – 2009-10-15 14:34:45

2

你的代碼絕對沒有錯。這是一個完全有效的結果。有10只豬和11只雞,你得到10+11=21個頭,而10*4 + 11*2 = 62只腿。

所以它返回一個正確的結果。

現在,如果您將其更改爲10個頭和62個腿,並且將代碼更改爲擁有8個蜘蛛腿,那麼您將得到3個豬,1個雞和6個蜘蛛的結果。

你的代碼只是最後一次嘗試蜘蛛,所以你不會得到任何蜘蛛,除非它有是蜘蛛。

2

具有2個方程和3個變量的線性系統未確定 - 對於任何給定的一組參數可能有多個解;這是你正在展示的代碼的情況。如果你想要的是儘可能少的蜘蛛獲得解決方案(如果有的話),那麼代碼沒什麼問題。

如果你想獲得的溶液(如果有的話)多達蜘蛛有可能,儘量「多蜘蛛」第一,例如改變外循環,這是現在

for numSpiders in range(0, numHeads + 1): 

即第一次嘗試,並且沒有蜘蛛的解決方案的話,那麼如果有一個失敗的嘗試,等等,是不是:

for numSpiders in reversed(range(0, numHeads + 1)): 

肚裏倒過來(這是什麼reversed是)和將嘗試numHeads蜘蛛首先,然後numHeads-1,等等。

(你的方程實際上是丟番圖的,即完全基於整數的,與具有分數解的普通線性方程相比,它具有重要的意義,但是這裏的問題並不與丟番圖方程問題有關,有關欠定線性系統)。

+2

我敢打賭,他沒想到的術語「丟番圖方程式「時,他寫了他的問題。 – 2009-10-15 14:58:14