Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从0打印到n的python递归函数?_Python_Recursion - Fatal编程技术网

从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
    时退出,因为我们只是在打印,之后没有什么要做的,可以返回
    None
    (Python的默认返回值)
更新

似乎编写尾部递归解决方案在这里风靡一时:)哦,好吧,这是我的一个尝试,是@AndyHayden想法的简化和尾部递归版本-使用尾部调用优化装饰器:

你可以这样做

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)