【问题标题】:recursion, Python, countup, countdown递归,Python,倒计时,倒计时
【发布时间】:2017-09-14 00:25:41
【问题描述】:

我应该写一个递归函数counting(5) 打印5 4 3 2 1 0 1 2 3 4 5。
我在下面做了两个功能,每个功能各做一半,但我需要将它们放在一起。

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

def countup(n):
    if n >= 1:
        countup(n - 1)
        print n,

【问题讨论】:

  • 合起来是什么意思,是一个功能吗?
  • @AbdenaceurLichiheb 倒计时打印 5 4 3 2 1 0 倒计时打印 1 2 3 4 5 但我需要一个打印 5 4 3 2 1 0 1 2 3 4 5 的函数
  • @TusharAggarwal 你介意解释一下你在说什么吗?
  • 哦,是的,你为什么不使用不同的功能直接调用向下然后向上调用

标签: python recursion


【解决方案1】:

我想诀窍是理解递归点不会结束执行:

def count_down_up(n):
    if not n:
        print n  # prints 0 and terminates recursion
        return
    print n  # print down 5, 4, 3, 2, 1
    count_down_up(n-1)  # recursion point
    print n  # prints up 1, 2, 3, 4, 5

可以看到每一步打印n, <RECURSION>, n,展开为:

5, <count_up_down 4>, 5
5, 4, <count_up_down 3>, 4, 5
# ...
5 ,4, 3, 2, 1, <count_up_down 0>, 1, 2, 3, 4, 5   # recursion stops ...
5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5

【讨论】:

  • 超级圆滑的答案 + 1。我认为 not n 也是最重要的线路之一,因为当 n 到达 0 时,not n 为 TRUE,然后反转开始。跨度>
  • 作为一个初学者,这花了我太长时间来理解.. 最后一个 print() 语句令人困惑,因为我认为递归函数会被调用直到达到 0 并在到达那里之前结束整个事情.但是在理解之后:“我想诀窍是理解递归点不会结束执行”它点击了。这仍然有点令人困惑,但这对我来说是一个重要的教训,谢谢!
【解决方案2】:

@Reut_Sharabani 解决方案很好,但我认为这更容易阅读:

def countdown(N,n):
    if abs(n) > N:
        return
    else:
        print(abs(n))
        countdown(N,n-1)

这样调用:

countdown(5,5)

【讨论】:

    【解决方案3】:

    一种方法是在递归期间跟踪 2 个列表,然后在最后返回时将它们拼接在一起。

    def countdown_up(n, i=0, down=[], up=[] ):
        if n >i:
            return countdown_up(n-1, i, down+[n], [n]+up)
        else:
            # stich the 2 lists together with the low point [i]
            return down+[i]+up
    
    # by default it counts down to 0. 
    >>>countdown_up(5)
    [5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5]
    # you can run with any arbitrary high and low numbers. 
    >>>countdown_up(10, 3)
    [10, 9, 8, 7, 6, 5, 4, 3, 4, 5, 6, 7, 8, 9, 10]    
    

    要让函数打印而不是返回列表,我们只需要更改 1 行。

    def countdown_up(n, i=0, down=[], up=[] ):
        if n >i:
            return countdown_up(n-1, i, down+[n], [n]+up)
        else:
            print(" ".join("%s "%x for x in down+[i]+up))
    
    
    >>>countdown_up(5)
    5  4  3  2  1  0  1  2  3  4  5 
    >>>countdown_up(10,3)
    10  9  8  7  6  5  4  3  4  5  6  7  8  9  10 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      相关资源
      最近更新 更多