从0到n打印的python递归函数?

时间:2013-06-15 19:53:52

标签: python recursion

我正在尝试编写一个从0打印到n的递归函数,但我不知道该怎么做。我不小心制作了一张从n打印到0但是:

def countdown(n):
    print(n)
    if n == 0:
        return 0
    return countdown(n - 1)

我不知道这是否有帮助,也许我可以更改代码中的某些内容,使其从0转到n

5 个答案:

答案 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)

请注意:

  • 您不必从仅打印值的递归函数返回任何内容
  • 要按升序打印,{/ 1}}语句必须在递归调用后放置
  • 递归出现在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)