2015-10-11 21 views
0

我有一個等比數列,檢查列表LST,如果它在蟒蛇

def geometric(lst): 
'checks whether the integers in list lst form a geometric sequence' 
    for i in range(1, len(lst) - 1): 
     if lst[i] * 2 == "don't know what to check here": 
      return True 
     else: 
      return False 

我不知道如何申請,要檢查所有的指標。寧願在for循環內完成此操作。任何幫助,將不勝感激!

+0

你應該明白的數學當你想要寫一個算法http://www.mathsisfun.com/algebra/sequences-sums-geometric.html –

回答

4

我想這樣的作品:

def geometric(lst): 
    for i in range(len(lst) - 2): 
     if lst[i] * lst[i + 2] != lst[i + 1] ** 2: 
      return False 
    return True 

這是基於這樣的想法,對於任何連續三個方面a, b, c,前兩個之間的比例必須等於最後兩個之間的比率,即b/a = c/b。重新排列這給a * c == b ** 2。使用沒有分割的形式會更好,因爲分割會引入舍入誤差。如果公共比例不是整數(例如[4, 6, 9]),該功能甚至可以工作。

編輯

以上回答不處理含0正確地列出。

正確的版本是:

def geometric(lst): 
    for i in range(len(lst) - 2): 
     if lst[i] * lst[i + 2] != lst[i + 1] ** 2: 
      return False 
    for i in range(len(lst) - 1): 
     if lst[i] == 0 and lst[i + 1] != 0: 
      return False 
    return True 

這將返回True[1, 0, 0](公比0),但對於False[0, 0, 1]。原始版本返回True

不允許普通口糧0可能會更好。這意味着將第二個循環更改爲返回False以獲取包含0的長度爲2或更多的任何列表。

+0

這是爲什麼downvoted? –

+0

工作正常!謝謝! – Frank

+2

可能缺少任何解釋 –

1

正如sam2090指出的那樣,第4行中條件的右側已經空了。如果等比數列的公比爲2(也許這是你真正想傳遞作爲函數的參數的東西),然後表達應該是:

if lst[i] == lst[i-1] * 2 

語句的左側指的是迭代(i)中的當前數字,而語句的右側指的是前一個數字(i-1)並將其值乘以2.

另外,在foor循環中,be確定你迭代直到列表中的最後一個元素,所以你應該寫:

for i in range(1, len(lst)): 

而不是

for i in range(1, len(lst) - 1):