Рекурсивные функции и списки, добавляющие / расширяющие - PullRequest
5 голосов
/ 28 марта 2012

Это очень простой код вместо большой проблемы, но я надеюсь, что смогу справиться с ним кусками.Я начну с моей первой проблемы.

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 Ответ

26 голосов
/ 28 марта 2012

Как насчет этого?

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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...