简单示例中的意外结果

3zz*_*zzy 0 python

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

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

    barnYard(20,56) # 8 pigs - 12 chickens
    barnYard(21,62) # 10 pig - 11 chickens
Run Code Online (Sandbox Code Playgroud)

20头和56腿返回8头猪和12头鸡,所以我做了21和62添加一只蜘蛛,但它仍然返回猪和鸡,代码中有什么不对?

谢谢!

Tim*_*ker 5

你的代码是正确的 - 在最外层for循环的第一次迭代中,numChicks0.由于solve一旦找到有效匹配就返回,则不会尝试另一个可能的有效匹配.

您可以将return语句更改为yield语句并迭代solve结果以获得所有可能的组合.

例如:

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

def barnYard(heads, legs):
    for pigs, chickens, bees in solve(legs, heads):
             print 'Number of pigs: ', pigs
             print 'Number of chickens: ', chickens
             print 'Number of bees: ', bees

barnYard(20,56)
Run Code Online (Sandbox Code Playgroud)

将输出:

Number of pigs:  8
Number of chickens:  12
Number of bees:  0

Number of pigs:  6
Number of chickens:  13
Number of bees:  1

Number of pigs:  4
Number of chickens:  14
Number of bees:  2

Number of pigs:  2
Number of chickens:  15
Number of bees:  3

Number of pigs:  0
Number of chickens:  16
Number of bees:  4
Run Code Online (Sandbox Code Playgroud)