从0打印到n的python递归函数?
我正试图编写一个递归函数,从从0打印到n的python递归函数?,python,recursion,Python,Recursion,我正试图编写一个递归函数,从0打印到n,但我不知道怎么做。我无意中制作了一个从n打印到0的打印机,不过: def countdown(n): print(n) if n == 0: return 0 return countdown(n - 1) 我不知道这是否有用,也许我可以更改代码中的某些内容,使其从0变为n?您可以将0和n以及+替换为a-,使递归倒计时函数变为递归倒计时: def countup(N, n=0): print(n)
0
打印到n
,但我不知道怎么做。我无意中制作了一个从n
打印到0
的打印机,不过:
def countdown(n):
print(n)
if n == 0:
return 0
return countdown(n - 1)
我不知道这是否有用,也许我可以更改代码中的某些内容,使其从
0
变为n
?您可以将0和n以及+替换为a-,使递归倒计时函数变为递归倒计时:
def countup(N, n=0):
print(n)
if n == N:
return
return countup(N, n + 1)
并称之为:
countup(3)
@JFSebastian指出,这种算法的优点是O(1)而不是O(n),正如本文所讨论的,如果与
@tail\u call\u optimized
decorator一起使用,则线性递归和迭代递归之间的区别。你大约有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
(Python的默认返回值)None
def fun(num,n):
if num<n:
print(num)
fun(num+1,n)
n=int(input())
print(fun(0,n+1))
def fun(num,n):
如果num您也可以尝试此方法:
def recursion_print(n):
if n==0:
print(n)
else:
recursion_print(n-1)
print(n)
recursion_print(9)
OP请求递归UP函数?不?这个答案是正确的,但它真的违背了目的。你不需要另一个论点来开始(而且,如果我在n
中输入1,它将不再从0
打印到n
——而是从n
打印到n
。不,不是。如果我在n
中输入任何值,它现在将从n
绑定到n
。您是否执行了该代码?输出实际上是从0打印到n
+1这显示了使用递归进行迭代的正确方法。@Makoto:(包括在内)确实如此。这将打印0 1 2 3 4 5,全部在单独的行上。如果这是倒计时,它将在单独的行上打印5 4 3 2 1 0。您的解决方案不需要O(n)内存。@Andy Hayden提供了一种在O(1)内存中执行此操作的方法(只需添加tail\u call decorator)。为了理解差异(您的答案是第一张图片)@J.F.Sebastian,我不知道Andy的解决方案如何使用更少的内存。两种解决方案都将使用n
堆栈帧,但Andy的每个帧有两个局部变量,而这只有一个。@Aya:注意:“添加tail\u call decorator”也就是说,使用该问题的任何递归解是不实际的,所以我认为Python被用作问题中的可执行伪代码,即假设一些一般的计算模型,其中函数调用不昂贵,并且一个平凡的尾调用消除可能存在。像那样,从技术上讲,它不再是一个递归函数,至少从任何有意义的定义来看是如此。因此,在我看来,它就像是一个迭代解决方案一样有效,其思路如下:for i in xrange(10):print i
,这将使用更少的内存。关于实用性,你可以用堆栈递归代替堆递归,或者使用,但我同意递归在这种情况下是不合适的。然而,它纯粹是学术性的,而不是你在实践中做过的事情。不知道这个装饰器,太棒了!
def fun(num,n):
if num<n:
print(num)
fun(num+1,n)
n=int(input())
print(fun(0,n+1))
def recursion_print(n):
if n==0:
print(n)
else:
recursion_print(n-1)
print(n)
recursion_print(9)