理解一个例子

3zz*_*zzy -1 python pseudocode

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
Run Code Online (Sandbox Code Playgroud)

我正在学习Python并且遇到了这个例子,有人可以用简单的英语(或伪代码)解释这是一行一行的.

非常感谢

Ale*_*lli 8

solve 计算总共达到给定数量的头部和腿部需要多少只小鸡(1头,2条腿)和多少头猪(1头,4腿).

它使用"蛮力",即最简单的方法:

  • 它甚至可以尝试从无到有的小鸡数量到指定为头数的多少(这是循环的作用for numChicks in range(0, numHeads + 1):,因为range从包含的起始值到排除的结束值给出整数);
  • 对于每一个给定的,numChicks它通过声明计算将提供所需数量的头的猪数量numPigs = numHeads - numChicks
  • 然后它计算那些小鸡和猪的总腿数 totLegs = 4*numPigs + 2*numChicks
  • 然后它检查是否totLegs等于所请求的数字:如果是,它返回一个包含两个项目的列表,解决问题的小鸡和猪的数量
  • 最后,如果它在for没有返回值的情况下"落在循环的底部" ,它知道没有解决方案,并且表示通过返回其中两个项目的每个列表None.

barnYard只需将解决方案委托给solve,并以一种可读的方式打印出来,或者作为"无解决方案"或者装饰精美的小鸡和猪.

现在,为了不断进步,问问自己是否solve可以更有效地编写.显然没有解决方案,如果腿的数量少于头数的两倍,或者是头数的四倍以上,或者奇数 - 也许solve可以测试这些情况并[None, None]立即返回.你可以编码......?

它可能并不明显,但是头和腿的数量的每个其他组合都有一个解决方案 - 并且有一种方法可以通过算术找到它,而不需要循环.考虑一下,也许在小学中学代数的帮助下......