2012-03-27 12 views
5

Bu daha büyük bir sorunun yerine çok basit bir koddur, ancak parçalarıyla başa çıkabileceğimi umuyorum. İlk problemimle başlayacağım.Yinelenen işlevler ve ekleme/genişletme listeleri

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

Bu, beynimin özyinelemesine yardımcı olan bir test işlevidir. Bir sayı alır, daha sonra iki sayıdaki çarpımları hedef sayısına ulaşana kadar gösterir. eğer öyleyse ben girin:

testrecurse(1,1000) 

Aldığım:

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

harika! Çıkış iyi ve temiz görünüyor. Ama benim problemim, çıktımda bu çok ilk değeri ekleyerek veya ekleyerek zor bir zaman geçiriyorum. Çıktının nasıl görünmesini istediğimi burada görüyorum.

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

Ben

x=[] to x=[z] 

değişen denedim ama sonra alırsınız:

herhangi bir yardım mutluluk duyacağız
[1, 2, 2, 4, 4, 8, 8, 16, 16, 32, 32, 64, 64, 128, 128, 256, 256, 512, 512, 1024, 1024] 

, ben özyineleme yeniyim ve başımı ağrıtıyor.

+1

2 ile çarpmadan önce ekleyiniz ve 'z

+0

Oh, bunun için teşekkürler, bunu düzeltmek gibi basit bir değişiklik farketmedim. – Unknown

cevap

25

Bu nasıl?

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

Örnek: bir daha 1024 içermez

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

not edin. Eğer bunu istiyorsan, normal yinelemeli bunu yazmak olmaz Tabii

 return [z] 

üçüncü satırı değiştirmek, bunun yerine bir for döngü veya itertools.takewhile() kullanın.

+0

Biliyor musun, listeyi birleştirmeyi hiç düşünmemiştim, bunun için çok teşekkür ederim, çok yardımcı olacağını düşünüyorum. – Unknown

+0

efendim, sahip olduğunuzdan daha fazlasını hak ediyorsunuz – SKandeel