2012-07-09 59 views
0

该程序的目标是为函数'Fib'取两个值,并将它们通过一个Fibonacci序列,并在变量“序列”中添加条件。当它通过'check'函数并返回Limit Reached时,它会将偶数值添加到'final'列表中,然后在循环后打印出'final'的总和。为什么函数不打印列表中的值的总和?

问题是无论Fib取什么样的值,'final'总是以没有值为结束。我很新的节目,似乎无法弄清楚它为什么这样做?

def even(x): 
    v = list(str(x))[-1] 
    if v == '0' or v == '2' or v == '4' or v == '6' or v == '8': 
     return x 
    else: 
     return 0 
def check(sequence): 
    for v in sequence: 
     if v >= 20: 
      return 'Limit Reached' 
     else: 
      return None 

def Fib(x,y): 
    sequence = [x,y] 
    a = 0 
    b = 1 
    final = [] 
    while len(sequence) < 100: 
     term = sequence[a] + sequence[b] 
     sequence.append(term) 
     if check(sequence) == 'Limit Reached': 
      for v in sequence: 
       final.apppend(even(v)) 
      print sum(final) 
      break 
     a += 1 
     b += 1 
+0

你可能需要做一些新的代码: 在序列v: 如果V%2 == 0: final.append(V) – darkphoenix 2012-07-09 21:26:46

+0

据我所知,Fib()函数对整数进行操作,所以更好的方法是进行位操作:'somevalue&1'什么是平等的1只有当数字是奇数时(不是偶数) – ddzialak 2012-07-09 21:42:29

+1

@ddzialak:可能最好使用'%'作为因为该算子位于整数的语义域中,而不是它们的表示。我们可能能够证明'a%2 == a&1',但除非我们最初着手按位进行操作,否则我认为最好使用'%'。在某些情况下,可能有理由不采取这种做法,但这显然是一个与初学者相关的问题,而不是看起来有点混乱的黑客。 – recursive 2012-07-09 21:45:36

回答

1

你不返回决赛,所以它的价值会在每次调用纤维蛋白原()的时间清零,因为这是一个局部变量。我相信它会打印出预期的结果,不是吗?

4

check总是返回None如果在列表中的第一项小于20

你大概的意思是:

def check(sequence): 
    for v in sequence: 
     if v >= 20: 
      return 'Limit Reached' 
    else: 
     return None 
+0

谢谢,这个解决方案工作。 – helix 2012-07-09 21:41:29

+0

@ecatmur我认为我喜欢'for'循环后使用'else',我将从现在开始使用它。 – jamylak 2012-07-10 03:57:06

0

的Python,不同于大多数语言,将抛出一个运行时错误这样的错字(而不是根本不编译你的程序)。

final.apppend(even(v)) 

没有看到运行时错误表明,周围if条件是永不满足,那是因为check方法序列中的第一个项目被选中后,而不是检查整个序列返回。

2

这段代码有很多问题。我会这样写:

def even(x): 
    # is the modulo operator, it's used to calculate a remainder 
    return x % 2 == 0 

def check(sequence): 
    # you need to check all the values, not just the first one 
    return max(sequence) >= 20 

def Fib(x, y): 
    sequence = [x, y] 

    while len(sequence) < 100: 
     # it's not necessary to keep a and b around, you can use 
     # negative indices instead 
     sequence.append(sequence[-2] + sequence[-1]) 

     if check(sequence): 
      # this is called a "generator comprehension" 
      print sum(v for v in sequence if even(v)) 
      break 

它仍然可以进一步简化,但是这种结构可以与您自己的结构相匹配。实际上,甚至不需要保留sequence,因为您可以随时保持运行总量,但我认为以这种方式看到它会更具启发性。

0

也许你想要的东西简单得多:

def fib(a, b, iterations = 20): 
    result = 0 
    if not (a & 1): result += a 
    if not (b & 1): result += b 
    for x in xrange(iterations): 
     nextval = a + b 
     if not (nextval & 1): 
      result += nextval 
     a = b 
     b = nextval 
    return result 
相关问题