2012-03-27 14 views
5

これは大きな問題の代わりに非常に簡単なコードですが、私はそれをチャンクで扱うことができます。私は最初の問題から始めます。再帰関数とリスト追加/延長

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

これは、私の脳を再帰で助けるためのテスト機能です。それは数値をとり、それが目標数に達するまで2の乗算をすべて表示します。ので、もし私が次のように入力します

testrecurse(1,1000) 

は私が受け取る:

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

偉大です!出力は良好できれいに見えます。しかし、ここに私の問題があります。私は自分の出力に、最初の値を追加するか、追加するのに苦労しています。ここで私は出力を見た目にしたいです。

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

私は

x=[] to x=[z] 

を変更しようとしましたが、その後、私は受け取る:任意の助けをいただければ幸い

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

、私は再帰に新たなんだ、それは私の頭が痛くなります。

+1

2を乗算する前に追加を試み、<=を使用する場合は

+0

ああ、ありがとう、私はそれを修正するような簡単な変更を実現しませんでした。 – Unknown

答えて

25

これはいかがですか?

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

例:これ以上1024が含まれていないことを

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

注意。あなたはこれをしたい場合は、もちろん

 return [z] 

に三行目を変更するには、通常、再帰的にこれを書くのではなく、forループまたはitertools.takewhile()を使用していないだろう。

+0

あなたは何を知っていますか、私はリストを連結することは考えていませんでした。ありがとうございました。 – Unknown

+0

あなたはあなたよりも多くの好きに値する – SKandeel