递归函数和列表追加/扩展

Unk*_*own 5 python recursion function list extend

这是一个非常简单的代码,代替了一个更大的问题,但我希望我可以解决它的问题.我将从第一个问题开始.

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

这是一个测试功能,可以帮助我的大脑进行递归.它需要一个数字,然后显示两个乘法的所有乘法,直到达到目标数.所以,如果我输入:

testrecurse(1,1000)
Run Code Online (Sandbox Code Playgroud)

我收到:

[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
Run Code Online (Sandbox Code Playgroud)

太棒了!输出看起来很干净.但这是我的问题,我很难在我的输出中追加或添加第一个值.这就是我想要输出的样子.

[1,2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
Run Code Online (Sandbox Code Playgroud)

我试过改变

x=[] to x=[z]
Run Code Online (Sandbox Code Playgroud)

但后来我收到了:

[1, 2, 2, 4, 4, 8, 8, 16, 16, 32, 32, 64, 64, 128, 128, 256, 256, 512, 512, 1024, 1024]
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,我是新来的递归,它让我头疼.

Sve*_*ach 26

这个怎么样?

def testrecurse(z, target):
    if z >= target:
        return []
    return [z] + testrecurse(2 * z, target)
Run Code Online (Sandbox Code Playgroud)

例:

>>> testrecurse(1, 1000)
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
Run Code Online (Sandbox Code Playgroud)

请注意,它不再包含1024.如果需要,请将第三行更改为

        return [z]
Run Code Online (Sandbox Code Playgroud)

当然你通常不会递归地写这个,而是使用for循环或itertools.takewhile().