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

5

这只是一个代替更大问题的非常简单的代码,但我希望我能够分块处理它。我将从我的第一个问题开始。

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

这是一个测试函数,用于帮助我理解递归。它接收一个数字,并显示所有的乘法结果,直到达到目标数字。例如,如果我输入:
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之前添加,然后将“if z < target”更改为使用<=。 - Lasse V. Karlsen
哦,谢谢你,我没想到这么简单的更改就能解决它。 - Unknown
1个回答

26

这个怎么样?

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

例子:

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

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

        return [z]

当然,通常情况下你不会使用递归来编写这个函数,而是使用for循环或者itertools.takewhile()


你知道吗,我从来没有想过要将列表连接起来,非常感谢你提供的这个方法,我觉得它会帮上很多忙。 - Unknown
您先生,您应该拥有更多的点赞。 - smohamed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接