2017-07-26 70 views
0

我想從種子以這種方式建立一個列表: seed, seed*weight - seed*weight**2等等,其中前一個數字是下一個的種子。所以用的.5seed3weightitertools積累構建遞歸列表

我們會得到

.5, -4, 24.0

這就是我想會的工作:

from itertools import accumulate, repeat 

relationship = lambda seed, weight: seed*weight - seed*weight**2 
seed = .5 
weight = 3 
inputs = list(repeat(seed,10)) 
first = [x for x in accumulate(inputs, relationship)] 

是問題的輸入列表創建一個.5 s的列表,而不是用我想要的數字填充列表?

+1

所以......你只是每乘以-6(或通常由體重 - 體重** 2)? – user2357112

回答

1

你的accumulate調用不使用你聲明的weight變量。相反,它使用inputs中的第一個值作爲第一個seed(正如預期的那樣),並將所有其他值作爲權重(而非意圖)。

你可以把它用不同的inputs列表工作:

inputs = [seed] + [weight]*10 
results = list(accumulate(inputs, relationships)) 

但我不知道accumulate真的是解決這一問題的最好辦法。我認爲這將是更自然地解決以另一種方式的問題,如具有無限發生器功能:

def gen(seed, weight): 
    while True: 
     seed = seed * weight - seed * weight**2 
     yield seed 

由於該系列是一個簡單的幾何級數,你可以(通過weight - weight**2每一步相乘)也寫一個函數來計算封閉式方程中的每個值:

def calc(seed, weight, n): 
    factor = weight - weight**2 
    return seed * factor**(n+1) 
+0

非常感謝,收益率是我試圖找出如何使用,但無法完成的跳躍。 – Dennis