2016-10-10 120 views
2

Python是否有遞歸序列生成函數?例如,遞歸序列生成器

def generateSequence(seed, f, n): 
    sequence = list(seed) 
    for i in range(n): 
     sequence.append(f(sequence, i)) 
    return sequence 

可以使用像這樣:

fibSequence = generateSequence([0, 1], lambda x, i: x[-1] + x[-2], 8) 

生產出:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 
+2

'對於我在範圍(n)中:yield f(sequence,i)'? –

+0

那麼,因爲'seed'是一個列表,'sequence = seed'沒有太大的成就,所以你可以刪除那一行。由於該列表是從外部傳入的,因此可能不需要返回它 - 只需保存對列表的引用,然後傳入該引用而不是使用文字。至少可以帶走一些「垃圾」。 – TigerhawkT3

+0

我不明白你的意思是遞歸序列生成器。 –

回答

0

我覺得itertools.accumulate可滿足您的需求,但它的返回值可能會有所不同從你的期望。

例如:

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

from itertools import accumulate 

def callback(seq, i): 
    """ 
     seq: the sequence you will modified 
     i: the number of times this function is called 
    """ 
    seq.append(seq[-1] + seq[-2]) 
    return seq 

res = accumulate([[0, 1]] + list(range(1, 8 + 1)), callback) 
for item in res: 
    print(item) 

[0, 1]是init序列,8是你要調用的函數callback次數。

和上面的代碼的結果是這樣的:

In [48]: run test.py 
[0, 1] 
[0, 1, 1] 
[0, 1, 1, 2] 
[0, 1, 1, 2, 3] 
[0, 1, 1, 2, 3, 5] 
[0, 1, 1, 2, 3, 5, 8] 
[0, 1, 1, 2, 3, 5, 8, 13] 
[0, 1, 1, 2, 3, 5, 8, 13, 21] 
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 

最後一個是你想要的。