首页 > 解决方案 > Python中的嵌套循环奇数模式

问题描述

我想制作如下图所示的图案:

N = 1
*

N = 3
  *
***
  *

N = 5
    *
  ***
*****
  ***
    *

等等...

不过,我写的这个程序只适用于 N = 5。谁能解释一下错误是什么以及解决方案是什么?谢谢。

N = int(input())
k = 1
for i in range(1, N - 1):
    for j in range(1, N + 1):
        if(j <= N - k):
            print(' ', end = '')
        else:
            print('*', end = '')
    k = k + 2
    print()

k = 2
for i in range(1, N - 2):
    for j in range(1, N + 1):
        if(j >= N - k):
            print('*', end = '')
        else:
            print(' ', end = '')
    k = k - 2
    print()

标签: pythondesign-patternsnested-loops

解决方案


您正在尝试使用范围打印带有两个 for 循环的 N 行金字塔。所以你的两个范围的长度之和应该是N。

现在考虑for i in range(1, N - 1)for i in range(1, N - 2)与一些大 N 的总和。以 N=99 为例:

len(range(1, 99 - 1)) + len(range(1, 99 - 2))
>>> 193

这是你的第一个错误。该函数仅适用于 N=5,因为您为范围选择了两个减号。你需要在这里做的是重写你的数学:

len(range((99+1)//2)) + len(range((99-1)//2))
>>> 99

请注意,我从范围中删除了起始值,因为这里不需要它。默认情况下,范围从 0 开始计数,并在结束值之前结束一个数字。

您遇到的第二个错误是您如何打印三角形的下半部分。基本上,您试图反转所有内容以反向打印所有内容,但这以某种方式破坏了逻辑。这里我们要做的是为每行打印 k 个空格,每行将 k 增加 2。

修复最少的功能:

N = int(input())
k = 1
for i in range((N+1)//2):
    for j in range(1, N + 1):
        if(j <= N - k):
            print(' ', end = '')
        else:
            print('*', end = '')
    k = k + 2
    print()

k = 2
for i in range((N-1)//2):
    for j in range(1, N + 1):
        if(j > k):
            print('*', end = '')
        else:
            print(' ', end = '')
    k = k + 2
    print()

推荐阅读