Bir örnek anlama

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

Bu satır satır ne yaptığını kimse düz ingilizce (veya sözde code) 'açıklayınız olabilir, Python öğrenme ve bu örnek geldi ediyorum.

Çok teşekkürler

Oluştur 11/10/2009 saat 05:08
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
1

bacakların doğru numarası vardır ve daha sonra domuz ve tavuk döner numaraları bulana kadar bu kafaların (belirtilen sayı ile), domuz ve tavuk, mümkün olan her kombinasyonunun yineleme edilir. geçerli bir cevap bulmadan her kombinasyonu ile girerse, başarısızlık belirtmek için [Hiçbiri, hiçbiri] döndürür.

Cevap 11/10/2009 saat 05:15
kaynak kullanıcı

oy
1

Esasen, solvetavuklar ve domuzların her türlü kombinasyonu ile yineleme edilir ve bunun bir eşleşme bulduğunda, bunları iade.)

NumChickens + NumPigs NumHeads eşit olmalıdır, bu nedenle NumHeads 0'dan her NumChickens (bu ne denetler for range(0,NumHeads+1)yapar) ve NumHeads-NumChickens olmak NumPigs ayarlar.

Oradan da eşleşirse ayaklarının sayısını çarparak ve görme onun sadece bir an meselesi.

Cevap 11/10/2009 saat 05:19
kaynak kullanıcı

oy
8

solve Bu kafa ve bacak verilen numara toplam için kaç piliç (1 baş, 2 bacak) ve kaç domuzlar (1 baş, 4 bacak) işlem olup.

Bu yaklaşım maksimum basit bir "kaba kuvvet" kullanır:

  • kafaları (yani döngünün bir rol sayısı olarak belirtildi olduğunca birçok hiç hiçbiri gelen civcivlerin bile mümkündür sayısını çalışır for numChicks in range(0, numHeads + 1):, çünkü rangedışlanmış bitiş değerine dahil başlangıç değerinden tam sayıları verir);
  • Verilen her için numChickso deyimi ile, kafaları istenilen sayı vermek olacağını kaç domuz hesaplarnumPigs = numHeads - numChicks
  • o zaman toplam bacaklar bu civciv ve domuzlar tarafından olurdu kaç hesaplar totLegs = 4*numPigs + 2*numChicks
  • o zaman kontrol ederse totLegseşit istenen numara: bu yüzden, bu iki öğe, sorunu çözmek civciv ve domuz numaraları içeren bir liste dönerse
  • bunun "alt düşer" eğer son olarak, forhenüz bir değer döndürdü almadan döngü, hiç bir çözüm olduğunu bilir ve işaret ettiği listemizi kimin iki öğe olduğunu her döndürerek None.

barnYardSadece delegeler çözüm solveya "çözümsüzlük" veya civciv ve domuzların olarak güzel dekore numaraları gibi ve güzel okunabilir şekilde baskılar dışarı.

Şimdi, eğer ilerleyen tutmak için kendinize sorun solvedaha verimli yazılmış olabilir. Ayak sayısı başlarının iki katından az numarası veya kafalarının dört katından fazla numarası veya tekse Açıkça çözüm yok - belki solvebu durum için test edebilir ve dönüş [None, None]hemen. Bunu kod misin ...?

Bu açık olmayabilir, ama kafaları ve bacak sayıların her kombinasyon bir çözümü var - ve döngü olmaksızın, yalnızca aritmetik bunu bulmak için bir yol var IS. belki ilkokul ortaokul cebir yardımıyla, Bir düşünün ...

Cevap 11/10/2009 saat 05:22
kaynak kullanıcı

oy
1

Temelde, sorunun, cevabını anlamaya çalışıyor "X kafaları ve Y bacaklar Avludaki varsa bir ahır kaç tavuk ve domuz vardır?" for numChicks in range(0, numHeads + 1):Kod numChicks = numHeads için numChicks = 0 dan içinden bir değişkenler numChicks ve döngüleri oluşturur. (Not: aralığı işlevi en yüksek değeri içermez).

numChicks her numara için, bu numChicks ve karşılık gelen numPigs değerleri numLegs doğru değeri ile gelir olup olmadığını görmek için kontrol eder. numHeads her yana numChicks + numPigs = numHeads doğru olacaktır, ancak numLegs dağılımına göre değişir - dolayısıyla döngü. herhangi bir noktada çözelti bulunduğunda (totLegs == numLegs olduğunda), daha sonra bu değeri verilir. Tüm döngü yapılan alır ve hiçbir çözüm bulunamadı takdirde, bu liste [Yok, Yok] Bu giriş için hiçbir çözüm yoktur, yani döndürülür.

Cevap 11/10/2009 saat 05:22
kaynak kullanıcı

oy
2

Alex Martelli ben tamlığı için buraya ekleriz bir cebirsel çözümü ima etmektedir. Bu eşzamanlı denklemler kullanılarak dışarı çalışılabilir. Basit bir matematiksel çözümü olmak, en azından için, muhtemelen daha hızlı büyük :-) bacak ve kafalarının numaralar

edelim:

  • H kafaları sayısı,;
  • L bacakların sayısı,;
  • CCivcivlerin sayı; ve
  • P domuz sayısı olabilir.

Verilen Cve Pbiz diğer iki değişken ile hesaplayabilirsiniz:

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

Ayrıntılı olarak veriyoruz her aşağıda hesaplamalarda adımı. Matematiksel olarak eğimli şüphesiz adımlar kombine edilebileceğini işaret edebilir ama açık olmasını tercih ederim. (1), biz hesaplayabilirsiniz:

   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)

ve ikame olduğu içerisine (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)

Şimdi iki formül, baş ve bacaklar civcivlerin sayısını hesaplayabilir tane var (4), civciv ve başlardan domuzların sayısını hesaplamak hangi diğer (3).

Yani burada uygun kontroller ile yapmak Python kodu, bize bir domuz ve yarım piliç ile birlikte bir yarısını yani 1 baş veren 2 kafaları ve 7 bacakları gibi, daha tuhaf matematiksel çözümlerin bazı izin vermez sağlamak için var ve 5 domuzlar ve -4 civciv veren 12 bacak :-)

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]

Eğer başın veya bacakların fraksiyonel sayıda geçmesi Tabii ki, eğer, tüm bahisler geçersiz. Burada iki yöntem de aynı değerleri dönmelerini sağlamak için çeşitli değerler deneyebilirsiniz böylece tam bir test programı var:

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)
Cevap 12/10/2009 saat 04:06
kaynak kullanıcı

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