2016-10-10 33 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

'for i in range(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] 

最後のものは、あなたが望んでいたです。