倒数然后再倒数

时间:2016-02-29 14:26:28

标签: python recursion counting

我需要编写一个倒计时的代码,逐步减少直至达到零,然后在每个整数之间以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=2需要几步。当我运行代码时,我得到了

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

如您所见,出现负整数,这是错误的。另外,我在代码中有n <= 7,我知道这是错误的。它应该对任何n插入都有效,并将该值用作上限。

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

6 个答案:

答案 0 :(得分:2)

你不需要任何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)。

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

答案 2 :(得分:1)

我不确定为什么第一个打印值应为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循环中打印了一个负值。如果打印然后更改值(我已做过),您需要重新考虑终止条件。或者更改打印和操作的顺序。

答案 3 :(得分:1)

我认为通过使用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 :(得分:1)

您示例中的硬编码7是相同的参数n,因此您应该使用它。您可以“重置”或从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函数将数字从6打印到2两两:

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

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

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

from itertools import chain

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

答案 5 :(得分:0)

首先,您调用updown(7, 2)它会减少到1:7, 5, 3, 1然后再次运行,因为语句while 1 >= 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