Înțelegerea un exemplu

voturi
-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

Sunt de învățare Python și a venit peste acest exemplu, poate cineva vă rugăm să explicați în limba engleză (sau pseudo-cod) simplu ce acest lucru este de a face linie cu linie.

Mulţumesc mult

Întrebat 11/10/2009 la 05:08
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
1

Este iterarea prin fiecare combinație posibilă de porci și pui (cu numărul specificat de capete) până când găsește una care are numărul corect de picioare, iar apoi returnează numărul de porci și pui. În cazul în care devine prin fiecare combinație, fără a găsi un răspuns valid, se întoarce [Nici unul, Nici unul] pentru a indica eșec.

Publicat 11/10/2009 la 05:15
sursa de către utilizator

voturi
1

În esență, solveeste iterarea prin fiecare combinație posibilă de pui și porci, și când găsește un meci, se întoarce.)

NumChickens + NumPigs trebuie să fie egală NumHeads, așa că verifică fiecare NumChickens de la 0 la NumHeads (asta e ceea ce for range(0,NumHeads+1)face), și stabilește NumPigs să fie NumHeads-NumChickens.

De acolo, ei doar o chestiune de multiplicare din numărul de picioare, și văzând dacă se potrivesc.

Publicat 11/10/2009 la 05:19
sursa de către utilizator

voturi
8

solve este de calcul cât de mulți pui (1 cap, 2 picioare) și câte porci (1 cap, 4 picioare) este nevoie la un total de până la numerele date de capete și picioare.

Acesta folosește o „forță brută“, adică, maxim simplu, abordare:

  • încearcă posibil chiar numărul de pui de la deloc la cât mai multe a fost specificat ca numărul de capete (care este rolul buclei for numChicks in range(0, numHeads + 1):, deoarece rangeoferă numere întregi de la valoarea de pornire inclusă la valoarea de sfârșit exclus);
  • pentru fiecare dat numChickscalculeaza cati porci ar fi de a da numărul cerut de capete, prin declarațianumPigs = numHeads - numChicks
  • apoi se calculează cât de multe picioare totale acei pui și porci ar fi, de totLegs = 4*numPigs + 2*numChicks
  • apoi se verifică dacă totLegsegal cu numărul solicitat: în caz afirmativ, se returnează o listă cu două elemente, numărul de pui și porci care rezolva problema
  • În cele din urmă, în cazul în care „cade din partea de jos“ a forbuclei fără să fi returnat o valoare încă, ea stie ca nu e nici o soluție, și semnifică faptul că prin returnarea unei liste fiecare dintre cele două elemente a căror este None.

barnYarddoar delegați soluția la solve, și imprimă - l într - un mod ușor de citit frumos, fie ca „nici o soluție“ sau numere frumos decorate de pui și porci.

Acum, pentru a păstra progresează, intreaba - te daca solvear fi scris mai eficient. În mod clar nu există nici o soluție în cazul în care numărul de picioare este mai mică decât de două ori numărul de capete, sau mai mult de patru ori mai mare decât numărul de capete, sau ciudate - poate solvear putea testa pentru aceste cazuri și să se întoarcă [None, None]imediat. Ați putea să cod care ...?

Este posibil să nu fie evident, dar orice altă combinație de numere de capete și picioare are o soluție - și există o modalitate de a găsi doar de aritmetică, fără looping. Gandeste-te, poate cu ajutorul elementar algebra gimnaziu ...

Publicat 11/10/2009 la 05:22
sursa de către utilizator

voturi
1

Practic, se încearcă să dau seama răspunsul la problema, „Cât de mulți pui și porci sunt acolo într - o batatura în cazul în care există X capete și picioare Y în batatura?“ for numChicks in range(0, numHeads + 1):Codul creează un variabile numChicks și cicluri prin ea de la numChicks = 0 până la numChicks = numHeads. (Notă: funcția de interval nu include valoarea cea mai mare).

Pentru fiecare număr de numChicks, se verifică dacă numChicks și valorile corespunzătoare numPigs vine cu valoarea corectă a numLegs. numHeads va fi întotdeauna corect deoarece numChicks + numPigs = numHeads, dar numLegs variază în funcție de distribuția - prin urmare, bucla. Dacă, în orice moment, soluția este găsită (când totLegs == numLegs), atunci această valoare este returnată. În cazul în care întreaga bucla se face și nici o soluție a fost găsită, atunci lista [Nici unul, Nici unul] este returnat, ceea ce înseamnă că nu există nici o soluție pentru această intrare.

Publicat 11/10/2009 la 05:22
sursa de către utilizator

voturi
2

Alex Martelli face aluzie la o soluție algebrică care voi include aici pentru completare. Acesta poate fi elaborat cu utilizarea de ecuații simultane. Fiind o soluție matematice simple, este posibil mai rapid, cel puțin pentru mare număr de picioare și capete :-)

Lăsa:

  • H fie numărul de capete;
  • L este numărul de picioare;
  • Cfie numărul de pui; și
  • P este numărul de porci.

Având în vedere Cși P, putem calcula celelalte două variabile cu:

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

Vom detalia fiecare pas în calculele de mai jos. Înclinat matematic poate , fără îndoială , subliniază faptul că măsurile ar putea fi combinate , dar aș prefera să fie explicit. De la (1), putem calcula:

   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)

și substitut că în (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)

Acum aveți două formule, una care se poate calcula numărul de pui de la cap și picioare (4), celălalt care se poate calcula numărul de porci de la pui și capete (3).

Deci, aici este codul Python pentru a face acest lucru, cu controale adecvate pentru a se asigura că nu permit unele dintre cele mai bizare solutii matematice, cum ar fi 2 capete si 7 picioare oferindu-ne un porc și jumătate, împreună cu o jumătate de pui, sau 1 cap și 12 picioare dau 5 porci și pui -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]

Desigur, dacă treci în numere fractionare de cap sau de picioare, toate pariurile sunt oprite. Iată un program complet de testare, astfel încât să puteți încerca diverse valori pentru a asigura ambele metode returnează aceleași valori:

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)
Publicat 12/10/2009 la 04:06
sursa de către utilizator

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