Forstå et eksempel

stemmer
-1
def solve(numLegs, numHeads):
    for numChicks in range(0, numHeads + 1):
        numPigs = numHeads - numChicks
        totLegs = 4*numPigs + 2*numChicks
        if totLegs == numLegs:
            return [numPigs, numChicks]
    return [None, None]

def barnYard(heads, legs):
    pigs, chickens = solve(legs, heads)
    if pigs == None:
        print There is no solution.
    else:
        print 'Number of pigs: ', pigs
        print 'Number of Chickens: ', chickens

Jeg lærer Python og kom over dette eksempelet, kan noen vennligst forklare i vanlig engelsk (eller pseudo-kode) hva dette gjør linje for linje.

Mange takk

Publisert på 11/10/2009 klokken 04:08
kilden bruker
På andre språk...                            


5 svar

stemmer
1

Det er å iterere gjennom alle mulige kombinasjoner av gris og kylling (med det angitte antall hoder) inntil den finner en som har det riktige antall ben, og deretter returnerer antallet griser og kyllinger. Hvis det blir gjennom hver kombinasjon uten å finne et gyldig svar, går det [Ingen, Ingen] for å indikere feil.

Svarte 11/10/2009 kl. 04:15
kilden bruker

stemmer
1

I hovedsak solveer iterere gjennom alle mulige kombinasjoner av høner og griser, og når den finner en kamp, returnerer den.)

NumChickens + NumPigs må være lik NumHeads, så det sjekker hver NumChickens fra 0 til NumHeads (det er det som for range(0,NumHeads+1)gjør), og setter NumPigs å være NumHeads-NumChickens.

Derfra er det bare et spørsmål om å multiplisere ut antall føtter, og se om de passer.

Svarte 11/10/2009 kl. 04:19
kilden bruker

stemmer
8

solve beregner hvor mange kyllinger (1 hode, 2 ben) og hvor mange griser (1 hode, 4 ben) som skal til for totalt opp til de gitte antall hoder og ben.

Den bruker en "brute force", det vil si maksimalt enkel, tilnærming:

  • den prøver til og med mulig antall kyllinger fra ingen i det hele tatt til så mange som ble angitt som antall hoder (som er rollen av loopen for numChicks in range(0, numHeads + 1):, da rangegir heltall fra startverdien inkludert for å sluttverdien ekskludert);
  • for hver gitt numChicksdet beregner hvor mange griser det ville være å gi den forespurte antall hoder, av setningennumPigs = numHeads - numChicks
  • så det beregner hvor mange totalt ben disse kyllinger og griser ville ha, ved å totLegs = 4*numPigs + 2*numChicks
  • da den sjekker om totLegslik ønsket nummer: hvis så, går den tilbake en liste med to elementer, tallene av kyllinger og griser som løser problemet
  • Til slutt, hvis det "faller på bunnen" av forloopen uten å ha returnert en verdi ennå, det vet er det ingen løsning, og betyr at ved å returnere en liste hver av hvis to elementer er None.

barnYardbare delegater løsningen på solve, og skriver det ut i et fint lesbar måte, enten som "ingen løsning" eller som pent dekorerte antall kyllinger og griser.

Nå, for å holde framdrift, spør deg selv om solvekunne skrevet mer effektivt. Klart det er ingen løsning dersom antall ben er mindre enn det dobbelte av antall hoder, eller mer enn fire ganger så mange hoder, eller rart - kanskje solvekunne teste for dem saken og kommer tilbake [None, None]med en gang. Kan du kode som ...?

Det kan ikke være opplagt, men hver annen kombinasjon av antall hoder og ben har en løsning - og det er en måte å finne det bare ved regning, uten looping. Tenk på det, kanskje med hjelp av elementære ungdomsskole algebra ...

Svarte 11/10/2009 kl. 04:22
kilden bruker

stemmer
1

I utgangspunktet er det å prøve å finne ut svaret på problemet, "Hvor mange høner og griser er det i en barnyard hvis det er X hoder og Y ben i et jorde?" Den for numChicks in range(0, numHeads + 1):kode oppretter en variabler numChicks, og sykluser gjennom den fra numChicks = 0 til numChicks = numHeads. (Merk: utvalget funksjonen inkluderer ikke den høyeste verdi).

For hvert nummer av numChicks, sjekker den for å se om det numChicks og tilhørende numPigs verdier kommer opp med den riktige verdien av numLegs. numHeads vil alltid være korrekt, siden numChicks + numPigs = numHeads, men numLegs varierer basert på fordelingen - derav sløyfen. Hvis på noe tidspunkt løsningen blir funnet (når totLegs == numLegs), så at verdien blir skrevet. Hvis hele løkken blir gjort, og ingen løsning ble funnet, vil lista [Ingen, Ingen] returnert, noe som betyr at det er ingen løsning for denne inngangen.

Svarte 11/10/2009 kl. 04:22
kilden bruker

stemmer
2

Alex Martelli henspiller på en algebraisk løsning som jeg vil inkludere her for fullstendighet. Det kan utarbeides med bruk av likninger. Å være en enkel matematisk løsning, er det muligens raskere, i hvert fall for store mengder bein og hoder :-)

La:

  • H være antall hoder;
  • L være antallet av ben;
  • Cvære antall kyllinger; og
  • P være antall griser.

Gitt Cog Pkan vi beregne de to andre variablene med:

H =  C +  P (1)
L = 2C + 4P (2)

Jeg detalj hvert trinn i beregningene nedenfor. Det matematisk tilbøyelig kan uten tvil påpeke at tiltak kan kombineres, men jeg foretrekker å være eksplisitt. Fra (1), kan vi beregne:

   H = C + P
=> 0 = C + P - H       [subtract H from both sides]
=> 0 = H - C - P       [multiply both sides by -1]
=> P = H - C           [add P to both sides] (3)

og erstatning som i (2):

    L = 2C + 4P
=>  L = 2C + 4(H - C)   [substitute H-C for P]
=>  L = 2C + 4H - 4C    [expand 4(H-C) to 4H-4C]
=>  L = 4H - 2C         [combine 2C-4C into -2C]
=>  0 = 4H - 2C - L     [subtract L from both sides]
=> 2C = 4H - L          [add 2C to both sides]
=>  C = 2H - L/2        [divide both sides by 2] (4)

Nå har du to formler, en som kan beregne antall kyllinger fra hode og ben (4), den andre som kan beregne antall griser fra kyllinger og hoder (3).

Så her er Python koden for å gjøre det, med nødvendige kontroller for å sikre at du ikke la noen av de mer bisarre matematiske løsninger, som 2 hoder og 7 ben gir oss en gris og en halv sammen med en halv kylling, eller en hode og 12 ben som gir 5 griser og kyllinger -4 :-)

def solve (numLegs, numHeads):
    # Use the formulae (these make integers).
    chicks = numHeads * 2 - int (numLegs / 2)
    pigs = numHeads - chicks

    # Don't allow negative number of animals.
    if chicks < 0 or pigs < 0:
        return [None, None]

    # Don't allow fractional animals.
    if chicks * 2 + pigs * 4 != numLegs:
        return [None, None]
    if chicks + pigs != numHeads:
        return [None, None]

    return [pigs, chicks]

Selvfølgelig, hvis du passerer i brøk antall hodet eller bena, er alle spill av. Her er en komplett testprogram slik at du kan prøve ut ulike verdier for å sikre begge metodene returnerer de samme verdiene:

import sys

def usage (reason):
    print "Error: %s"%(reason)
    print "Usage: solve <numHeads> <numLegs>"
    sys.exit (1);

def solve1 (numLegs, numHeads):
    for numChicks in range (0, numHeads + 1):
        numPigs = numHeads - numChicks
        totLegs = 4 * numPigs + 2 * numChicks
        if totLegs == numLegs:
            return [numPigs, numChicks]
    return [None, None]

def solve2 (numLegs, numHeads):
    chicks = numHeads * 2 - int (numLegs / 2)
    pigs = numHeads - chicks
    if chicks < 0 or pigs < 0:           return [None, None]
    if chicks * 2 + pigs * 4 != numLegs: return [None, None]
    if chicks + pigs != numHeads:        return [None, None]
    return [pigs, chicks]

if len (sys.argv) != 3:
    usage ("Wrong number of parameters (%d)"%(len (sys.argv)))

try:    heads = int (sys.argv[1])
except: usage ("Invalid <numHeads> of '%s'"%(sys.argv[1]))

try:    legs = int (sys.argv[2])
except: usage ("Invalid <numLegs> of '%s'"%(sys.argv[2]))

print "[pigs, chicks]:"
print "  ", solve1 (legs, heads)
print "  ", solve2 (legs, heads)
Svarte 12/10/2009 kl. 03:06
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more