我正在尝试编写一个从0
to打印的递归函数n
,但我不知道该怎么做。我不小心做了一个从n
to打印的0
:
def countdown(n):
print(n)
if n == 0:
return 0
return countdown(n - 1)
我不知道这是否有帮助,也许我可以更改代码中的某些内容以使其从0
变为n
?
你在那里大约 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)
你几乎明白了!这是一个固定的简化版本:
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
您可以将 0 和 n 以及 + 替换为 - 以使您的递归倒计时函数变为递归倒计时:
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 recursion_print(n):
if n==0:
print(n)
else:
recursion_print(n-1)
print(n)
recursion_print(9)
你可以这样做
def fun(num,n):
if num<n:
print(num)
fun(num+1,n)
n=int(input())
print(fun(0,n+1))