Κατανόηση ένα παράδειγμα

ψήφοι
-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

Μαθαίνω Python και ήρθε σε αυτό το παράδειγμα, μπορεί κάποιος παρακαλώ να εξηγήσει σε απλά αγγλικά (ή ψευδο-κώδικα) τι είναι αυτό που κάνει γραμμή προς γραμμή.

Πολλά ευχαριστώ

Δημοσιεύθηκε 11/10/2009 στις 05:08
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
1

Είναι επανάληψη μέσω κάθε δυνατό συνδυασμό χοίρους και κοτόπουλα (με τον καθορισμένο αριθμό των κεφαλών) μέχρι να βρει ένα που έχει το σωστό αριθμό των ποδιών, και στη συνέχεια επιστρέφει τον αριθμό των χοίρων και κοτόπουλων. Αν αυτό γίνεται μέσα από κάθε συνδυασμό, χωρίς να βρουν μια έγκυρη απάντηση, επιστρέφει [Καμία, Κανένα] για να δείξει την αποτυχία.

Απαντήθηκε 11/10/2009 στις 05:15
πηγή χρήστη

ψήφοι
1

Ουσιαστικά, solveη επανάληψη με κάθε δυνατό συνδυασμό κοτόπουλα και χοίρους, και όταν βρίσκει έναν αγώνα, να την επιστρέψει.)

NumChickens + NumPigs πρέπει να ισούται με NumHeads, έτσι ώστε να ελέγχει κάθε NumChickens από το 0 έως το NumHeads (αυτό είναι που for range(0,NumHeads+1)κάνει), και θέτει NumPigs να NumHeads-NumChickens.

Από εκεί, μόνο του ένα θέμα πολλαπλασιάζοντας τον αριθμό των ποδιών, και να δει αν ταιριάζουν.

Απαντήθηκε 11/10/2009 στις 05:19
πηγή χρήστη

ψήφοι
8

solve είναι υπολογιστών πόσες γκόμενες (1 κεφάλι, 2 πόδια) και τον αριθμό των χοίρων (1 κεφάλι, 4 πόδια) που χρειάζεται για να φτάσει μέχρι τις δίνεται αριθμό των κεφαλών και των ποδιών.

Χρησιμοποιεί μια «ωμή βία», που είναι, μέγιστη απλή προσέγγιση:

  • προσπαθεί ακόμη δυνατό αριθμό των νεοσσών από καθόλου έως όσες έχει καθοριστεί ο αριθμός των κεφαλών (αυτός είναι ο ρόλος του βρόχου for numChicks in range(0, numHeads + 1):, δεδομένου ότι rangeδίνει ακέραιοι από την αρχική τιμή περιλαμβάνεται στην τελική τιμή εξαιρούνται)?
  • για κάθε δεδομένη numChicksυπολογίζει πόσοι χοίροι θα είναι εκεί για να δώσει το απαιτούμενο αριθμό των κεφαλών, από τη δήλωσηnumPigs = numHeads - numChicks
  • τότε υπολογίζει πόσα συνολικά τα πόδια οι νεοσσοί και χοίροι θα πρέπει, κατά totLegs = 4*numPigs + 2*numChicks
  • Στη συνέχεια ελέγχει αν το totLegsίσο με το απαιτούμενο αριθμό: αν ναι, επιστρέφει μια λίστα με δύο στοιχεία, ο αριθμός των νεοσσών και των χοίρων που λύνουν το πρόβλημα
  • Τέλος, σε περίπτωση που «πέσει από τα κάτω» του forβρόχου χωρίς να έχει επιστρέψει μια τιμή όμως, γνωρίζει ότι δεν υπάρχει λύση, και σημαίνει ότι με την επιστροφή ενός πίνακα του οποίου οι δύο στοιχεία είναι None.

barnYardαπλά αναθέτει τη λύση solveκαι την εκτυπώνει σε ένα ωραίο ευανάγνωστο τρόπο, είτε ως «μη λύση» ή ως όμορφα διακοσμημένα αριθμός των νεοσσών και των χοίρων.

Τώρα, για να κρατήσει την πρόοδο, ρωτήστε τον εαυτό σας αν solveθα μπορούσε να γραφτεί πιο αποτελεσματικά. Είναι σαφές ότι δεν υπάρχει λύση, αν ο αριθμός των ποδιών είναι μικρότερο από το διπλάσιο του αριθμού των κεφαλών, ή περισσότερο από τέσσερις φορές τον αριθμό των κεφαλών, ή περίεργο - ίσως solveθα μπορούσε να δοκιμάσει για όσους υπόθεση και να επιστρέψει [None, None]αμέσως. Θα μπορούσατε να κωδικοποιήσει ότι ...;

Μπορεί να μην είναι προφανής, αλλά κάθε άλλο συνδυασμό του αριθμού των κεφαλών και των ποδιών έχει μια λύση - και υπάρχει ένας τρόπος για να το βρείτε μόνο από αριθμητική, χωρίς looping. Σκεφτείτε το, ίσως με τη βοήθεια του δημοτικού μέσης εκπαίδευσης άλγεβρα ...

Απαντήθηκε 11/10/2009 στις 05:22
πηγή χρήστη

ψήφοι
1

Βασικά, αυτό που προσπαθεί να καταλάβω την απάντηση στο πρόβλημα, «Πόσοι κοτόπουλα και χοίρους σε μια barnyard εκεί, αν υπάρχουν κεφάλια Χ και Υ τα πόδια στο barnyard;» Ο for numChicks in range(0, numHeads + 1):κώδικας δημιουργεί ένα μεταβλητές numChicks, και οι κύκλοι μέσα από αυτό από numChicks = 0 έως numChicks = numHeads. (Σημείωση: η λειτουργία εύρος δεν περιλαμβάνει την υψηλότερη τιμή).

Για κάθε αριθμό των numChicks, ελέγχει για να δει αν αυτό numChicks και η αντίστοιχη αξία numPigs έρχεται με τη σωστή τιμή της numLegs. numHeads πάντα θα είναι σωστή επειδή numChicks + numPigs = numHeads, αλλά numLegs ποικίλει με βάση την κατανομή - εξ ου και του βρόχου. Εάν σε οποιοδήποτε σημείο βρίσκεται το διάλυμα (όταν totLegs == numLegs), τότε αυτή η τιμή επιστρέφεται. Αν το σύνολο του βρόχου γίνεται τίποτα και δεν βρέθηκε λύση, τότε η λίστα [Καμία, Κανένα] επιστρέφεται, πράγμα που σημαίνει ότι δεν υπάρχει λύση για αυτή την είσοδο.

Απαντήθηκε 11/10/2009 στις 05:22
πηγή χρήστη

ψήφοι
2

Alex Martelli παραπέμπει σε μια αλγεβρική λύση που θα περιλαμβάνουν εδώ για λόγους πληρότητας. Μπορεί να επεξεργαστεί με τη χρήση των εξισώσεων. Όντας μια απλή μαθηματική λύση, είναι ενδεχομένως πιο γρήγορα, τουλάχιστον για μεγάλους αριθμούς από τα πόδια και το κεφάλι :-)

Αφήνω:

  • H είναι ο αριθμός των κεφαλών?
  • L είναι ο αριθμός των ποδιών?
  • Cείναι ο αριθμός των νεοσσών? και
  • P είναι ο αριθμός των χοίρων.

Λαμβάνοντας υπόψη Cκαι P, μπορούμε να υπολογίσουμε τις άλλες δύο μεταβλητές με:

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

Εγώ θα λεπτομέρεια σε κάθε βήμα παρακάτω υπολογισμούς. Η μαθηματική κλίση να επισημάνω καμία αμφιβολία ότι τα βήματα θα μπορούσαν να συνδυαστούν, αλλά θα προτιμούσα να είναι ρητή. Από την (1), μπορούμε να υπολογίσουμε:

   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)

και υποκατάστατο αυτό σε (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)

Τώρα έχετε δύο τύπους, μια που μπορεί να υπολογίσει τον αριθμό των νεοσσών από το κεφάλι και τα πόδια (4), το άλλο που μπορεί να υπολογίσει τον αριθμό των χοίρων από νεοσσούς και τα κεφάλια (3).

Έτσι, εδώ είναι ο κώδικας Python για να το κάνει, με κατάλληλους ελέγχους για να διασφαλιστεί ότι δεν επιτρέπουν μερικές από τις πιο παράξενες μαθηματικές λύσεις, όπως η 2 κεφάλια και 7 πόδια μας δίνει ένα γουρούνι και ένα μισό μαζί με μισό γκόμενα, ή 1 κεφάλι και 12 πόδια δίνοντας 5 χοίρους και -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]

Φυσικά, αν έχετε περάσει σε κλασματική αριθμούς από το κεφάλι ή τα πόδια, όλα τα στοιχήματα είναι ανοικτά. Εδώ είναι ένα πλήρες πρόγραμμα δοκιμών ώστε να μπορείτε να δοκιμάσετε διάφορες τιμές για να εξασφαλίσουν οι δύο μέθοδοι επιστρέφουν τις ίδιες αξίες:

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)
Απαντήθηκε 12/10/2009 στις 04:06
πηγή χρήστη

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