2016-10-10 4 views
2

Hat Python eine rekursive Sequenz, die Funktion generiert?Rekursiver Sequenzgenerator

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

Zur Herstellung:

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

'für i in Bereich (n): Ausbeute f (Sequenz, i)'? –

+0

Nun, da 'seed' eine Liste ist, bringt' sequenz = seed' nicht viel, so dass Sie diese Zeile entfernen können. Und da diese Liste von außen eingegeben wurde, muss sie möglicherweise nicht zurückgegeben werden. Speichern Sie einfach einen Verweis auf die Liste und geben Sie dann diesen Verweis ein, anstatt ein Literal zu verwenden. Das nimmt zumindest etwas von dem "Müll" weg. – TigerhawkT3

+0

Ich verstehe nicht, was Sie mit rekursiven Sequenzgenerator meinen. –

Antwort

0

Ich denke, die itertools.accumulate Ihre Bedürfnisse erfüllen können, aber es ist Rückgabewert kann unterschiedlich sein zum Beispiel

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

, die wie so verwendet werden können von dem, was du erwartest.

Zum Beispiel:

#!/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) 

Die [0, 1] ist die init-Sequenz und die 8 ist die Anzahl, wie oft Sie die callback Funktion aufrufen möchten.

Und das Ergebnis der obigen Code ist dies:

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] 

Der letzte ist man wollte.