在简单的examp中出现意外结果

2024-06-28 18:51:34 发布

您现在位置: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添加蜘蛛,但它仍然返回猪和鸡,代码有什么问题?在

谢谢!在


Tags: ofnonenumberfordefprintsolvenumchicks
3条回答

一个由2个方程和3个变量组成的线性系统是不确定的,任何给定的参数集都可能有多个解;这确实是您所展示的代码的情况。如果你想要的是用尽可能少的蜘蛛得到解决方案(如果有的话),那么代码没有问题。在

如果您想用尽可能多的蜘蛛来获得解决方案(如果有的话),请先尝试“many spider”,例如更改外部循环,现在

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

也就是说,首先尝试在根本没有蜘蛛的情况下获得解决方案,如果失败,则尝试使用一个蜘蛛,以此类推,取而代之的是:

^{pr2}$

它反过来(这就是reversed的作用),它将首先尝试numHeads蜘蛛,然后{},依此类推。在

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

您的代码是正确的-在最外层的for循环的第一次迭代中,numChicks是{}。由于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)

将输出:

^{pr2}$

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

所以它返回一个正确的结果。在

现在,如果您将其更改为10头62条腿,并将代码更改为蜘蛛的8条腿,那么您将得到3头猪、1只鸡和6只蜘蛛的结果。在

您的代码只是最后一次尝试spider,所以除非成为spider,否则不会得到任何spider。在

相关问题 更多 >