【问题标题】:loop numbers down and up and not using recursion in python向下和向上循环数字,而不是在python中使用递归
【发布时间】:2018-09-14 01:05:59
【问题描述】:

我的代码有一个小问题。我似乎无法弄清楚如何做到这一点。我可以让它与两个 for 循环一起工作。但是在练习中它说我只能使用一个循环来获得结果。 代码应该执行这个:

反弹2(4):

  • 4
  • 3
  • 2
  • 1
  • 0
  • 1
  • 2
  • 3
  • 4

我想出了什么:

def bounce2(n):
    for x in range(n,-1,-1):
    print(x)

打印出 4,3,2,1,0 但是现在我不知道该怎么办.. 我尝试了不同的 if 语句,例如:

def bounce2(n):
   for x in range(n,-1,-1):
   print(x)
   if n == 0:
   x = x + 1
   print(x)

但它们只打印一个整数,因为它们不在循环中。 如果我尝试在循环中创建 if 语句,也会出现同样的情况,然后它会打印出类似 433221100 的内容。我不知道如何让数字切换位置。 print 语句也应该是整数而不是字符串。所以我不能用replaced。

真的需要帮助来弄清楚逻辑。感谢所有帮助。

【问题讨论】:

  • 提示:您需要循环2*n+1 次,以打印这些行。
  • 我应该把它们放在哪里?在 if 语句之后 x = x + 1 是?

标签: python for-loop numbers integer bounce


【解决方案1】:

所以,在向您展示代码之前,我的一些思考过程。显然有九行,或者更一般地说是n * 2 + 1 行。因为我们需要倒计时到 0 并倒计时。这就是您需要调用 print 的次数。

现在,如果您将行号添加到预期输出并将其视为描述函数f(i, n) 的表,其中i 是行号,n 是起始值和结束值。 f 是什么?你能写出公式吗?例如

i f(i, 4)
0  4
1  3
2  2
3  1
4  0
5  1
6  2
7  3
8  4

我们可以写下代码的基本结构,我们仍然不知道f 长什么样,但假设我们有它:

for i in range(2*n+1):
    print f(i)

那么,f 是什么?现在你需要有一点创意,也许可以尝试一下。我所做的是尝试in 的基本算术组合以匹配f(i, n),我很快注意到n - i 一直有效,直到我们到达输出的后半部分,这仅与- 不同签名。

i f(i, 4) n - i
0  4       4
1  3       3
2  2       2
3  1       1
4  0       0
5  1       -1
6  2       -2
7  3       -3
8  4       -4

Soooo,取n - ii - n 的绝对值,随便吧。

def f(i, n):
    return abs(n-i)

【讨论】:

  • 谢谢@xiaofeng.li 这让我更清楚了。
【解决方案2】:

我认为这是一个非常优雅的解决方案:

def bounce(n):
    for x in range(-n, n+1):
        print(abs(x))

我们的循环从 n 的负数到 n 的正数,打印绝对值。

【讨论】:

  • 是的,非常东方和整洁。谢谢你的解决方案。我之前尝试过:for x in range(n,-n-1,-1): print(abs(x)) 但不知道我可以使用 abs() 函数将负整数变为正数:)跨度>
【解决方案3】:

由于您需要向下计数n 次,然后向上计数n 次,而1 来自计数0,而不是在两个单独的循环中实际向下计数然后向上计数,我们可以使用一个循环向上计数2 * n + 1 次,这实际上就像向n 计数然后从n 反弹,所以我们可以简单地计算到n 的“距离”,它是n - x 的绝对值:

def bounce2(n):
    for x in range(2 * n + 1):
        print(abs(n - x))

这样bounce2(4) 就会输出:

4
3
2
1
0
1
2
3
4

【讨论】:

  • 感谢您的回答。我仍然有点困惑你是如何想出 2 * n + 1 的。我知道如果你不使用 abs(n-x)) 和只打印出 x。你怎么知道它应该是 abs(n - x))?
  • 2 * n 来自于你需要向下数n 次,再向上数n 次,而1 来自于数0。因此,我们可以使用一个循环向上计数2 * n + 1 次,而不是实际在两个单独的循环中向下计数,然后向上计数,这实际上就像向n 计数然后反弹n,所以我们可以简单地计算“距离”到n,而不是abs(n - x) 返回。
【解决方案4】:

一个非常简单的解决方案是:

for i in range(n, -(n+1), -1):
    print(abs(i))

这就像在某个点上镜像数字。
在您的情况下,该点为零并且具有相同的镜像使用abs

【讨论】:

    【解决方案5】:

    试试下面,有一个列表l,其中一个元素为str(n),遍历n的范围乘以2,然后检查x是否大于n+2,如果它是@987654326加1 @,否则从 n 中减去 1,两种情况都附加到 l,然后在最后执行 str.join 以加入 '\n'(换行符)和 l

    def bounce2(n):
       l=[str(n)]
       for x in range(n*2):
          if x>n+2:
             n+=1
             l.append(str(n))         
          else:
             n-=1
             l.append(str(n))
       return '\n'.join(l)
    print(bounce2(4))
    

    输出:

    4
    3
    2
    1
    0
    1
    2
    3
    4
    

    【讨论】:

    • 感谢您的回答。您能解释一下您在编写代码时的想法吗?
    • @teslagosu 编辑我的
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2021-03-20
    • 2014-09-20
    相关资源
    最近更新 更多