简单示例中的意外结果

时间:2009-10-15 14:21:45

标签: 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
20头和56腿返回8头猪和12头鸡,所以我做了21和62添加一只蜘蛛,但它仍然返回猪和鸡,代码中有什么错误?

谢谢!

3 个答案:

答案 0 :(得分: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)

将输出:

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

答案 1 :(得分:2)

您的代码完全没有问题。这是一个完全有效的结果。有10只猪和11只鸡,你得到10+11=21头,10*4 + 11*2 = 62腿。

因此它会返回正确的结果。

现在,如果你将它改为10个头和62个腿,并且还将代码更改为蜘蛛的8条腿,那么你得到的结果是3只猪,1只鸡和6只蜘蛛。

你的代码只是最后尝试蜘蛛,所以你不会得到任何蜘蛛,除非它 是蜘蛛。

答案 2 :(得分:2)

具有2个方程和3个变量的线性系统未被确定 - 对于任何给定的参数集可能存在多个解;对于您正在展示的代码,情况确实如此。代码没有错,如果您想要的是获得尽可能少的蜘蛛的解决方案(如果有的话)。

如果您希望使用尽可能多的蜘蛛获得解决方案(如果有的话),请首先尝试“多个蜘蛛”,例如更改外部循环,现在是

    for numSpiders in range(0, numHeads + 1):

即,首先尝试获得一个根本没有蜘蛛的解决方案,然后如果失败尝试使用一个蜘蛛,依此类推:

    for numSpiders in reversed(range(0, numHeads + 1)):

反之亦然(这就是reversed的用途)并首先尝试numHeads个蜘蛛,然后是numHeads-1,依此类推。

(你的方程式实际上是丢番图式,即严格基于整数,与普通线性方程相比,它具有重要的意义,它允许分数解,但你的问题与丢番图方程问题无关,只是对于关于欠定线性系统)。