рекурсивная функция 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))