2012-03-27 5 views
5

Dies ist ein sehr einfacher Code anstelle eines größeren Problems, aber ich hoffe, ich kann es in Brocken angehen. Ich fange mit meinem ersten Problem an.Rekursive Funktionen und Listen anfügen/erweitern

def testrecurse(z,target): 
    x=[] 
    if z<target: 
     z*=2 
     x.append(z) 
     x.extend(testrecurse(z,target)) 
    return x 

Dies ist eine Testfunktion, um mein Gehirn mit Rekursion zu helfen. Es dauert eine Zahl und zeigt dann alle Multiplikationen von zwei an, bis es die Zielzahl erreicht. also wenn ich ein:

testrecurse(1,1000) 

I erhalten:

[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] 

Das ist sehr gut! Ausgabe sieht gut und sauber aus. Aber hier ist mein Problem, es fällt mir schwer, diesen ersten Wert in meiner Ausgabe anzuhängen oder hinzuzufügen. Hier ist, wie die Ausgabe aussehen soll.

[1,2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] 

Ich habe versucht,

x=[] to x=[z] 

ändern, aber dann habe ich erhalten:

[1, 2, 2, 4, 4, 8, 8, 16, 16, 32, 32, 64, 64, 128, 128, 256, 256, 512, 512, 1024, 1024] 

jede mögliche Hilfe würde geschätzt, ich bin neu zu Rekursion und es macht meinen Kopf verletzt.

+1

Versuchen Sie, anzufügen, bevor Sie mit 2 multiplizieren, und ändern Sie 'if z

+0

Oh, danke dafür, ich wusste nicht, dass eine einfache Änderung wie diese es beheben würde. – Unknown

Antwort

25

Wie wäre es damit?

def testrecurse(z, target): 
    if z >= target: 
     return [] 
    return [z] + testrecurse(2 * z, target) 

Beispiel:

>>> testrecurse(1, 1000) 
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512] 

Beachten Sie, dass es nicht 1024 mehr enthält. Wenn Sie dies wollen, ändern Sie die dritte Zeile zu

 return [z] 

Natürlich würden Sie normalerweise nicht diese rekursiv schreiben, sondern verwenden eine for Schleife oder itertools.takewhile().

+0

Weißt du was, ich dachte nie daran, die Liste zu verketten, vielen Dank dafür, ich denke es wird viel helfen. – Unknown

+0

Sie, Herr, verdienen mehr Likes als Sie haben – SKandeel