黄老师大笨蛋 发表于 2023-7-11 11:17:26

课后习题杨氏三角形的一个小问题

下列代码是习题的参考答案,用该代码进行打印后,在最后两行之间会存在一行空白行,这是什么原因?又该如何解决?



# 初始化杨辉三角形
# 创建一个10*10的二维列表,并将所有的元素初始化为0
triangle = []
for i in range(10):
    triangle.append([])
    for j in range(10):
      triangle.append(0)
# 计算杨辉三角形
# 根据观察,我们知道杨辉三角形左右两边的元素均为1
for i in range(10):
    triangle = 1
    triangle = 1
   
# 第i行j列的值 = 第(i-1)行(j-1)列的值 + 第(i-1)行(j)列的值
for i in range(2, 10):
    for j in range(1, i):
      triangle = triangle + triangle
   
# 输出杨辉三角形
for i in range(10):
    # 因为是三角形,所以i越小,前边需要填充的TAB越多
    for k in range((10-i)//2):
      print('\t', end='')
    for j in range(i+1):
      # 要形成“隔行错开”的效果,所以我们在偶数行加4个空格
      if i % 2 == 1:
            print("    ", end='')
      # 为何要使用TAB而非空格,大家可以将下面的end='\t'改成对应的空格数即可知晓
      print(triangle, end='\t')
    print()


陶远航 发表于 2023-7-11 11:17:37

在最后两行之间存在一行空白行的原因是代码中的print()语句。在最外层的循环中,当i等于0、1时,内层的for j in range(i+1)循环不会执行,因此print()语句会执行两次,输出两行空白行。

为了解决这个问题,可以添加一个判断条件,只有在内层循环执行时才执行print()语句,即当i大于等于2时。修改代码如下:

# 输出杨辉三角形
for i in range(10):
    # 因为是三角形,所以i越小,前边需要填充的TAB越多
    for k in range((10-i)//2):
      print('\t', end='')
   
    if i >= 2:
      for j in range(i+1):
            # 要形成“隔行错开”的效果,所以我们在偶数行加4个空格
            if i % 2 == 1:
                print("   ", end='')
            # 为何要使用TAB而非空格,大家可以将下面的end='\t'改成对应的空格数即可知晓
            print(triangle, end='\t')
   
    print()


通过添加判断条件,可以确保只在内层循环执行时输出杨辉三角形的数字,从而避免了最后两行之间的空白行。

歌者文明清理员 发表于 2023-7-11 11:17:54

陶远航 发表于 2023-7-11 11:17
在最后两行之间存在一行空白行的原因是代码中的print()语句。在最外层的循环中,当i等于0、1时,内层的for...

我擦

Threebody1 发表于 2023-7-11 11:18:06

Ewan-Ahiouy 发表于 2023-7-11 11:19:12

造成空白行的原因是在偶数行(i % 2 == 0)输出每个元素后没有添加制表符(\t),导致下一行的元素紧邻当前行的元素而没有缩进。

要解决这个问题,可以在偶数行的内循环中添加对应数量的制表符,使得每个元素与奇数行的元素对齐。修改代码如下:

for i in range(10):
    for k in range((10-i)//2):
      print('\t', end='')
    for j in range(i+1):
      # 偶数行添加制表符和额外空格
      if i % 2 == 0:
            print('\t', end='')
      print(triangle, end='\t')
    print()

通过在偶数行的内循环中添加一个制表符和额外的空格,即可保证输出结果的对齐。

Heng_Xin 发表于 2023-7-11 12:13:17

鱼币{:10_256:}谢谢

davidmou 发表于 2023-7-11 19:10:10

.

奋斗中的鱼 发表于 2023-7-30 22:07:46

末尾循环不是还有个print()m吗

smallwh 发表于 2023-7-31 06:42:50

本帖最后由 smallwh 于 2023-7-31 07:06 编辑

我试了一下,原因是IDLE的宽度太小了,打印不开一整行,先横向拉宽一些再运行就好了
页: [1]
查看完整版本: 课后习题杨氏三角形的一个小问题