我需要编写一个倒计时的代码,逐步减少直至达到零,然后在每个整数之间以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插入都有效,并将该值用作上限。
我被困住了,不知道该怎么做。它应该是一个递归代码,不应使用内置函数。原因是我想了解基础知识,并从那里继续,没有任何捷径。
答案 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 function和for loop而不是while
循环以及使用手动计数器。为了给你一个想法(让你重新定义你的功能“homework”),...
以下是一个for
循环,使用range
函数逐个打印从0
到7
的数字:
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 >= 1
为True
所以它会再次减少。
第二个问题是当你减少输出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