首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个简单示例中的意外结果

一个简单示例中的意外结果
EN

Stack Overflow用户
提问于 2009-10-15 14:21:45
回答 3查看 253关注 0票数 0
代码语言:javascript
复制
   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来添加一个蜘蛛,但它仍然返回猪和鸡,代码中有什么问题?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-15 14:31:35

您的代码是正确的-在最外层的for循环的第一次迭代中,numChicks0。由于solve在找到有效匹配后立即返回,因此不会尝试另一个可能的有效匹配。

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

例如:

代码语言:javascript
复制
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)

将输出:

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2009-10-15 14:28:32

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2009-10-15 14:30:49

具有2个方程和3个变量的线性系统是欠确定的--对于任何给定的参数集,都可能有多个解;对于您所显示的代码,确实是这种情况。如果您想要的是用尽可能少的爬行器获得解决方案(如果有的话),那么代码没有任何错误。

如果你想用尽可能多的爬行器得到解决方案(如果有的话),首先尝试“多个爬行器”,例如更改外部循环,现在是

代码语言:javascript
复制
    for numSpiders in range(0, numHeads + 1):

也就是说,首先试图得到一个根本没有蜘蛛的解决方案,如果失败了,就尝试一个,以此类推,取而代之的是:

代码语言:javascript
复制
    for numSpiders in reversed(range(0, numHeads + 1)):

反过来(这就是reversed的作用),它将首先尝试numHeads爬行器,然后是numHeads-1,依此类推。

(您的方程实际上是丢番图方程,即严格基于整数的方程,与允许分数解的普通线性方程相比,这具有重要的影响,但您的问题不限于丢番图方程问题,只是关于欠定线性系统的问题)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1572676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档