倒计时然后向上

Count down and then up

我需要编写一个递减计数的代码,递减 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<=7,我知道这是错误的。它应该对我插入的任何 n 都有效并将该值用作上限。

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

首先你调用 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

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

我认为通过使用 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 循环。

您示例中的硬编码 7 是相同的参数 n,因此您应该改用它。您可以 "reset" 或从 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 function and the for 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 一个数字在每个循环中。这样,您就不必重复 print 语句(或者在将来重复 processing 块)。

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

from itertools import chain

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

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

range(start, stop[, step])

This is a versatile function to create lists containing arithmetic progressions. It is most often used in for loops. The arguments must be plain integers. If the step argument is omitted, it defaults to 1. If the start argument is omitted, it defaults to 0. The full form returns a list of plain integers [start, start + step, start + 2 * step, ...]. If step is positive, the last element is the largest start + i * step less than stop; if step is negative, the last element is the smallest start + i * step greater than stop. step must not be zero (or else ValueError is raised).

一种递归的方法来做同样的事情

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)