2012-07-09 62 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 
相關問題