11

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

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

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

4

5 回答 5

16

你在那里大约 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)
于 2013-06-15T19:57:39.480 回答
14

你几乎明白了!这是一个固定的简化版本:

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
于 2013-06-15T20:01:15.283 回答
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),正如这篇关于线性递归和迭代递归之间区别的优秀文章@tail_call_optimized中所讨论的,如果与装饰器一起使用。

于 2013-06-15T19:57:30.683 回答
0

你也可以试试这个方法:

def recursion_print(n):
    if n==0:
      print(n)
    else:
      recursion_print(n-1)
      print(n)


recursion_print(9)
于 2020-08-07T06:32:08.347 回答
0

你可以这样做

def fun(num,n):
    if num<n:
        print(num)
        fun(num+1,n)
n=int(input())
print(fun(0,n+1)) 
于 2018-03-14T09:47:51.180 回答