我正在尝试编写一个从0
打印到n
的递归函数,但我不知道该怎么做。我不小心制作了一张从n
打印到0
但是:
def countdown(n):
print(n)
if n == 0:
return 0
return countdown(n - 1)
我不知道这是否有帮助,也许我可以更改代码中的某些内容,使其从0
转到n
?
答案 0 :(得分:13)
那里你大概有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)
答案 1 :(得分:8)
你几乎得到了它!这是一个固定的简化版本:
def countup(n):
if n >= 0:
countup(n - 1)
print(n)
请注意:
print
时,鉴于我们只是打印,之后没有什么可以做的,可以返回n < 0
(Python的默认返回值)<强>更新强>
似乎编写一个尾递归解决方案在这里风靡一时:)哦,好吧,这是我的镜头,@ AndyHayden的想法的简化和尾递归版本 - 使用尾调用优化装饰器{{3} }:
None
无论哪种方式,它都按预期工作:
@tail_call_optimized
def countup(N, n=0):
print(n)
if n < N:
countup(N, n + 1)
答案 2 :(得分:3)
您可以将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),如本excellent article中所讨论的关于线性递归和迭代递归之间的区别,如果用于@tail_call_optimized
装饰者。
答案 3 :(得分:0)
你可以这样做
def fun(num,n):
if num<n:
print(num)
fun(num+1,n)
n=int(input())
print(fun(0,n+1))
答案 4 :(得分:0)
您也可以尝试这种方法:
def recursion_print(n):
if n==0:
print(n)
else:
recursion_print(n-1)
print(n)
recursion_print(9)