рекурсивная функция python, которая печатает от 0 до n?

Я пытаюсь написать рекурсивную функцию, выводящую из 0 to n, но я понятия не имею, как это сделать. Я случайно сделал один, который печатает из n to 0 но:

def countdown(n):
    print(n)
    if n == 0:
        return 0
    return countdown(n - 1)

Я не знаю, помогает это или нет, может быть, я могу изменить что-то в коде, чтобы заставить его перейти от 0 to n?

4 ответов


вы почти получили его! вот фиксированная, упрощенная версия:

def countup(n):
    if n >= 0:
        countup(n - 1)
        print(n)

обратите внимание, что:

  • вам не нужно ничего возвращать из рекурсивной функции, которая только печатает значения
  • для печати в возрастающем порядке,print заявление должно быть помещено после рекурсивный вызов
  • рекурсия завершается, когда n < 0, учитывая, что мы только печатаем, после этого ничего не остается, и можно вернуться None (возвращаемое значение Python по умолчанию)

обновление

похоже, что написание хвостового рекурсивного решения-это вся ярость здесь:) Ну, вот мой выстрел в него, упрощенная и хвостовая рекурсивная версия идеи @AndyHayden-использование декоратора оптимизации хвостового вызова рецепт:

@tail_call_optimized
def countup(N, n=0):
    print(n)
    if n < N:
        countup(N, n + 1)

в любом случае, он работает, как ожидалось:

countup(5)
=> 0
   1
   2
   3
   4
   5

вы около 99% там.

подумайте о своем базовом случае и рекурсивном шаге - когда вы нажмете 0, что вы хотите сделать? Когда вы все еще работаете свой путь вниз от n что ты хочешь?

если вы измените порядок, в котором вы печатаете значение, вы достигнете желаемого результата.

def countdown(n):
    if n != 0:
        countdown(n-1)
    print(n)

причина этого заключается в том, что рекурсивные вызовы идут на стеке вызовов. Когда вы нажимаете вызовы в стек, в то время как ваш конечный случай не выполняется, вы будете продолжайте добавлять больше вызовов, пока не достигнете базового случая n == 0, а затем вы начнете печатать исключительно значения.

другие вызовы затем попадают в инструкцию print, так как их выполнение вернулось в строку после условного.

Итак, стек вызовов выглядит так:

countdown(5)
    countdown(4)
        countdown(3)
            countdown(2)
                countdown(1)
                    countdown(0)
                    print(0)
                print(1)
            print(2)
         print(3)
     print(4)
print(5)

вы можете заменить 0 и n, а также + на a -, чтобы сделать рекурсивную функцию обратного отсчета рекурсивным countup:

def countup(N, n=0):
    print(n)
    if n == N:
        return
    return countup(N, n + 1)

и назовите это следующим образом:

countup(3)

@JFSebastian указывает, что этот алгоритм имеет преимущество быть O(1), а не O (n), как описано в этом отличная статья о разнице между линейной и итеративной рекурсией, если используется с @tail_call_optimized оформителя.


вы можете сделать это

def fun(num,n):
    if num<n:
        print(num)
        fun(num+1,n)
n=int(input())
print(fun(0,n+1))