2012-03-27 5 views
5

To jest bardzo prosty kod w miejsce większego problemu, ale mam nadzieję, że poradzę sobie z nim w porcjach. Zacznę od mojego pierwszego problemu.Funkcje rekursywne i listy dołączające/rozszerzające

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

To jest funkcja testu, która pomaga mojemu mózgowi w rekursji. Ma liczbę, a następnie pokazuje wszystkie mnożenia dwóch, dopóki nie trafi w numer docelowy. więc jeśli wejdę:

testrecurse(1,1000) 

Otrzymuję:

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

który jest wielki! Wyjście wygląda dobrze i czysto. Ale tutaj jest mój problem, mam trudności z dodaniem lub dodaniem tej pierwszej wartości, w moich wynikach. Oto, jak chcę wyglądać dane wyjściowe.

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

Próbowałem zmieniając

x=[] to x=[z] 

ale potem otrzymują:

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

Każda pomoc będzie mile widziane, jestem nowy na rekursji i to sprawia, że ​​mój ból głowy.

+1

Spróbuj dodać przed pomnożeniem przez 2, a zamiast tego zmień 'if z

+0

Och, dziękuję ci za to, nie zdawałem sobie sprawy, że taka prosta zmiana to naprawi. – Unknown

Odpowiedz

25

Co powiesz na to?

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

przykład:

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

Należy zauważyć, że nie obejmuje ono 1024 więcej. Jeśli chcesz to zmienić trzecią linię do

 return [z] 

oczywiście normalnie nie napisać to rekurencyjnie, ale raczej użyć for pętlę lub itertools.takewhile().

+0

Wiesz co, nigdy nie myślałem o łączeniu się z listą, dziękuję ci bardzo za to, myślę, że to dużo pomoże. – Unknown

+0

sir, zasługujesz na więcej polubień niż ty – SKandeel