2009-10-15 8 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

하지 않는 것이 코드에서 오류가하지만 거미는 팔 다리를 가지고 : –

답변

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 –

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, 등등.

(방정식은 실제로 정수 기반이며 엄격한 정수 기반이므로 소수 솔루션을 허용하는 일반 선형 방정식과 비교할 때 중요한 의미가 있지만 문제는 디오 판틴 방정식 문제와 관련이 없습니다. bit under under 결정 선형 시스템).

+2

을 나는 그가 용어를 기대되지 내기 것을 " 디오 판틴 방정식 "을 작성했다. –

관련 문제