【问题标题】:Count down and then up倒计时然后向上
【发布时间】:2016-02-29 14:26:28
【问题描述】:

我需要编写一个倒计时的代码,以 2 步递减,直到达到零,然后在每个整数之间再以 1 步递增计数。 举个例子,如果我定义一个函数updown(n)并写updown(7),它应该给出:

6 4 2 0 1 2 3 4 5 6 7

这是我的尝试:

def updown(n,m):
    while n>=1:
        print(n-1)
        n=n-m

    while n<=7:
        print(n)
        n=n+1

这需要 m 步,在我的情况下是 m=2。当我运行代码时,我得到了

 6 4 2 0 -1 0 1 2 3 4 5 6 7

如您所见,出现了一个负整数,这是错误的。另外,我的代码中有 n

我被困住了,不知道该怎么办。它应该是一个递归代码,不应使用内置函数。原因是我想了解基础知识并从那里继续,没有任何捷径。

【问题讨论】:

  • 为什么第一个打印的值应该是6?不应该是7吗?
  • 我忘记了它应该给每个偶数并减少2个步骤。对不起
  • 您的起始代码不是递归的。递归函数是调用自身的函数。如果这是编程课程的作业,那么您应该重新考虑您的实现。像this 这样的东西会是递归的(也有点令人费解,我只是快速写了一个例子)。

标签: python recursion counting


【解决方案1】:

你不需要任何while循环,

你可以像这样使用range

>>> range(6,-2,-2) + range(1,8)
[6, 4, 2, 0, 1, 2, 3, 4, 5, 6, 7]

功能:

def updown(n, m):
    return range(n -1, -1 * m, -2) + range(1,n+1)

输出:

[6, 4, 2, 0, 1, 2, 3, 4, 5, 6, 7]

范围(开始,停止[,步骤])

这是一个创建包含算术的列表的通用函数 级数。它最常用于 for 循环。论据必须 是普通整数。如果省略 step 参数,则默认为 1。 如果省略 start 参数,则默认为 0。完整形式 返回一个普通整数列表 [start, start + step, start + 2 * 步, ...]。如果 step 为正,则最后一个元素是最大的开始 + i * 步小于停止;如果 step 为负数,则最后一个元素是最小的 start + i * step 大于 stop。步长不能为零 (否则会引发 ValueError)。

【讨论】:

  • 也许值得添加到 range 函数的链接,因为文档会随着时间的推移而改进/修改。无论如何 +1。
【解决方案2】:

同样的递归方式

def updown(n,m = 2):
    if n % 2 == 0:
        updownhelper(-n,n,m)
    else:
        updownhelper(-(n-1),n,m)

def updownhelper(a ,n,b = 2):
    if a < 0:
        print(str(-a))
        updownhelper(a+b,n,b)
    elif a == n:
        print(a)
    elif a >= 0:
        b = 1
        print(str(a))
        updownhelper(a+b,n,b)

updown(6)

【讨论】:

    【解决方案3】:

    我认为使用n-1 会使事情变得比应有的复杂。

    只需先计算小于给定数的最大偶数:

    n2 = n-(n%2)
    

    或更笼统的(对于m):

    nm = n-(n%m)
    

    下次使用range:

    for i in range(nm,-1,-m):
        print(i)
    

    最后打印来自0 包括n 的所有号码:

    for i in range(n+1):
        print(i)
    

    或将它们放在一起:

    def updown(n,m):
        nm = n-(n%m)
        for i in range(nm,-1,-m):
            print(i)
        for i in range(n+1):
            print(i)
    

    根据我自己的经验,修改变量比较un-pythonic。 Python 的目标是有点声明性:如果变量可以具有不同的值来迭代它,则使用 for 循环。

    【讨论】:

    • 感谢您花时间解释!欣赏!
    【解决方案4】:

    我不确定为什么第一个打印的值应该是 6 所以解决方案可能是错误的,但如果你想要你的输出尝试:

    def updown(n,m):
        start = n
        #n -= 1
        # or if you want the first number that is divisible by m:
        n = m * (n // m)  # Floor division ignores decimal places so this is the first number divisible by m
    
        while n >= m:
            print(n)
            n -= m
    
        while n <= start:
            print(n)
            n += 1
    
    
    updown(7, 2)
    

    您的解决方案的问题是您在减去之前打印了该值,因此该值实际上小于打印的值,因此您在第二个 while 循环中打印了一个负值。如果您打印然后更改值(我所做的),则需要重新考虑终止条件。或者改变打印和操作的顺序。

    【讨论】:

    • 如果我正确阅读了 cmets,计数应该从第一个 even 数字开始,但是 n=6...
    • @Newbie_01 没问题。不要忘记投票任何有用的答案。
    • @MSeifert 他/她不能投票,没有足够的声誉。
    【解决方案5】:

    您示例中的硬编码7n 参数相同,因此您应该改用它。您可以“重置” 或从0(硬编码)开始第二个循环。

    def updown(n,m):
    
        aux = n # Don't modify n
    
        while aux > 1: # Use aux instead of n
                       # Also, `>=` changed for `>`
                       # so `0` is not counted in this loop
            print(aux - 1)
            aux = aux - m
    
        aux = 0 # aux reseted
    
        while aux <= n: # See how n take place for 7
            print(aux)
            aux = aux + 1
    

    但是,对于该特定任务,更常见的是使用range functionfor loop 而不是while 循环和使用手动计数器。给你一个想法(让你重新定义你的函数为“homework”),...

    这是一个for 循环,使用range 函数将07 的数字一一打印出来:

    for i in range(8):
        print(i)
    

    这是一个for 循环,使用range 函数将62 的数字两两打印出来:

    for i in range(6, 0, -2):
        print(i)
    

    最后,您可以使用chain method from itertools 对许多循环的每次迭代执行相同的操作,就像您的情况一样,您希望在每个循环中简单地打印一个数字。这样,您就不必重复该 print 语句(或在将来重复该 processing 块)。

    这是一个链接两个暴露的for 循环的示例:

    from itertools import chain
    
    for i in chain(range(6, 2, -2), range(8)):
        print(i) # Processor block
    

    【讨论】:

      【解决方案6】:

      首先你调用updown(7, 2)它减少到1:7, 5, 3, 1然后它再次运行,因为语句while 1 &gt;= 1True所以它再减少一次。

      第二个问题是当你减少它时输出print(n - 1)而不是print(n)

      我相信你的解决方案就是这样。

      def updown(n, m):
          while n >= m:
              print(n)
              n = n - m
      
          while n <= 7:
              print(n)
              n = n + 1
      

      但是,如果您想从偶数开始,则解决方案是:

      def updown(n, m):
          if n % 2 != 0:
              n = n - 1
          while n >= m:
              print(n)
              n = n - m
      
          while n <= 7:
              print(n)
              n = n + 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多