-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を学んでいて、この例に出くわしました.誰かが簡単な英語(または疑似コード)でこれが行ごとに何をしているのか説明してもらえますか.

どうもありがとう

4

5 に答える 5

8

solveは、指定された数の頭と脚を合計するには、何羽のひよこ (1 頭、2 脚) と何頭の豚 (1 頭、4 脚) が必要かを計算しています。

それは「総当たり」、つまり最大限に単純なアプローチを使用します。

  • ひよこ数がまったくないものから、頭の数として指定された数まで、可能な数のひよこを試します(含まれる開始値から除外される終了値までの整数を与えるfor numChicks in range(0, numHeads + 1):ため、これが loop の役割です)。range
  • 与えられたそれぞれnumChicksについて、次のステートメントによって、要求された頭の数を与えるために何匹のブタが存在するかを計算します。numPigs = numHeads - numChicks
  • 次に、これらのヒヨコとブタの足の合計数を計算します。 totLegs = 4*numPigs + 2*numChicks
  • 次に、要求された数と等しいかどうかをチェックします。等しい場合totLegsは、問題を解決したひよこと豚の数の 2 つの項目を含むリストを返します。
  • for最後に、まだ値を返さずにループの「最下位に落ちた」場合、解決策がないことを認識し、2 つの項目のそれぞれが であるリストを返すことによってそれを示しますNone

barnYard解決策を に委譲し、solve「解決策なし」として、またはきれいに装飾されたひよこや豚の数として、読みやすい方法で出力します。

さて、進歩を続けるために、solveもっと効率的に書けるかどうか自問してみてください。脚の数が頭の数の 2 倍未満、頭の数の 4 倍以上、または奇数の場合、明らかに解決策はありません。これらの場合をテストして、すぐsolveに戻ることができます。[None, None]それをコーディングできますか...?

明らかではないかもしれませんが、頭と足の数の他のすべての組み合わせには解決策があります。ループせずに算術だけでそれを見つける方法があります。考えてみてください、おそらく初等中学校の代数の助けを借りて...

于 2009-10-11T04:22:24.340 に答える
2

Alex Martelli は、完全を期すためにここに含める代数的ソリューションをほのめかしています。連立方程式を使えば解けます。単純な数学的解であるため、少なくとも多数の脚と頭の場合は、おそらくより高速です:-)

させて:

  • H頭の数です。
  • L脚の数です。
  • Cひよこの数です。と
  • P豚の数になります。

と が与えられるCP、他の 2 つの変数は次のように計算できます。

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)これで、頭と脚からヒナの数を計算できる式と、ヒヨコと頭から豚の数を計算できる式の 2 つの式ができ(3)ました。

これを実行するための Python コードは次のとおりです。適切なチェックを行って、頭が 2 つ足が 7 本の場合、豚と半分、ひよこが半分、または頭が 1 つと5匹の豚と4匹のひよこを与える12本の足:-)

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)
于 2009-10-12T03:06:12.837 に答える
1

ブタとニワトリのすべての可能な組み合わせ (頭の数が指定されている) を反復処理して、正しい数の脚を持つものが見つかるまで繰り返し、ブタとニワトリの数を返します。有効な答えが見つからずに各組み合わせを通過した場合、[None, None] を返して失敗を示します。

于 2009-10-11T04:15:14.120 に答える
1

基本的に、solveニワトリとブタのすべての可能な組み合わせを繰り返し処理し、一致するものが見つかったらそれを返します。)

NumChickens + NumPigs は NumHeads に等しくなければならないため、0 から NumHeads までのすべての NumChickens をチェックし (これfor range(0,NumHeads+1)がそうです)、NumPigs を NumHeads-NumChickens に設定します。

そこから、足の数を掛けて、それらが一致するかどうかを確認するだけです。

于 2009-10-11T04:19:38.293 に答える
1

基本的には、「納屋に X 頭と Y 脚がある場合、納屋には鶏と豚が何羽いるか」という問題の答えを見つけようとしています。コードは変数 numChicks を作成し、for numChicks in range(0, numHeads + 1):numChicks = 0 から numChicks = numHeads まで循環します。(注: 範囲関数には最高値は含まれません)。

numChicks の数ごとに、その numChicks と対応する numPigs の値が numLegs の正しい値になるかどうかを確認します。numChicks + numPigs = numHeads であるため、numHeads は常に正しい値になりますが、numLegs は分布に基づいて変化するため、ループが発生します。任意の時点で解が見つかった場合 (totLegs == numLegs の場合)、その値が返されます。ループ全体が完了し、解決策が見つからない場合、リスト [None, None] が返されます。これは、この入力に対する解決策がないことを意味します。

于 2009-10-11T04:22:45.040 に答える