liupu65 发表于 前天 16:26

杨辉三角萌新求助

萌新想打印杨辉三角但是失败了,用答案里面的代码更丑,求助

我自己的代码:
triangle = [ * 10 for i in range(10)]

for i in range(10):
    triangle = 1
    triangle = 1

for i in range(1,10):
    for j in range(1,9):
      triangle = triangle + triangle

for i in range(10):
    for j in range(i+1):
      print(triangle,end=" ")
    print()

for i in range(10):
    for k in range((10-i)//2):
      print('\t',end='')
    for j in range(i+1):
      print(triangle,end="\t")
    print()

答案里面的代码:
# 输出杨辉三角形
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()

FishC 发表于 前天 16:26

鱼油你好,别急,杨辉三角要分两步:先“生成”,再“打印”。你直接把生成和打印混在一起,所以容易乱。

你代码里的主要问题:
1. triangle = [ * 10 for i in range(10)] 写法不对,而且杨辉三角每行长度不同,不需要固定 10 列。
2. triangle = 1 会把列表覆盖成整数,后面就不能用了。
3. triangle = triangle + triangle 这里不是上一行相邻两个数相加,逻辑不对。
4. 你贴的答案代码只是“打印部分”,里面用到的 triangle 必须先自己生成好,否则会报错。

正确完整代码可以这样写:


n = 10
triangle = []

# 生成杨辉三角
for i in range(n):
    row = * (i + 1)
    for j in range(1, i):
      row = triangle + triangle
    triangle.append(row)

# 打印杨辉三角
for i in range(n):
    # 前面补空格,让它看起来是三角形
    for k in range(n - i - 1):
      print("   ", end="")
    for num in triangle:
      print(f"{num:5d}", end="")
    print()


核心就一句话:每一行首尾都是 1,中间第 j 个数等于上一行第 j-1 个加第 j 个。

如果你就想照你贴的答案那种打印方式,把最后打印部分换成:


for i in range(n):
    for k in range((n - i) // 2):
      print('\t', end='')
    for num in triangle:
      if i % 2 == 1:
            print("    ", end='')
      print(num, end='\t')
    print()


记住:先有 triangle,再打印;不要边打印边硬算。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liupu65 发表于 前天 16:48

答案的代码为啥错了

FishC 发表于 前天 16:48

liupu65 发表于 2026-10-09 16:48
答案的代码为啥错了

答案代码错在两点:

1. 它只有“打印”,没有“生成” triangle
   杨辉三角必须先算出来。比如:


triangle = []
for i in range(10):
    row = * (i + 1)
    for j in range(1, i):
      row = triangle + triangle
    triangle.append(row)


2. 打印时写错了变量
   答案里是 print(triangle, end='\t')
   这样会反复打印整个二维列表,而不是当前行第 j 个数。
   应该改成:


print(triangle, end='\t')


所以答案代码直接运行会报 NameError: name 'triangle' is not defined。
就算前面刚好有 triangle,输出也会完全乱掉。它只是“打印部分”的思路,不是完整可运行代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liupu65 发表于 前天 16:55

FishC 发表于 2026-10-9 16: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()

答案的代码是这样的,就会出错,你的代码是对的

FishC 发表于 前天 16:55

liupu65 发表于 2026-10-09 16:55
FishC 发表于 2026-10-9 16:26
鱼油你好,别急,杨辉 ...

这段“答案代码”不能直接运行,是因为很多地方把二维列表的索引写丢了,变成了直接对 `triangle` 整个列表赋值或打印。具体错在这些地方:

1. 初始化时:
   triangle.append() 少了 [] ,应该是 triangle.append([])
   triangle.append(0) 应该是 triangle.append(0)

2. 设置两边为 1 时:
   triangle = 1 应该是 triangle = 1
   triangle = 1 应该是 triangle = 1

3. 计算中间值时:
   triangle = triangle + triangle 应该是
   triangle = triangle + triangle

4. 打印时:
   print(triangle, end='\t') 应该是
   print(triangle, end='\t')

修正后的完整代码是这样:


# 初始化 10x10 二维列表,全部填 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

# 计算中间值
for i in range(2, 10):
    for j in range(1, i):
      triangle = triangle + triangle

# 输出
for i in range(10):
    for k in range((10 - i) // 2):
      print('\t', end='')
    for j in range(i + 1):
      if i % 2 == 1:
            print("    ", end='')
      print(triangle, end='\t')
    print()


记住:二维列表要用 triangle 来访问具体位置,不能直接写 triangle。萌新一开始容易漏掉索引,多写几遍就顺了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liupu65 发表于 前天 17:10

FishC 发表于 2026-10-9 16:55
这段“答案代码”不能直接运行,是因为很多地方把二维列表的索引写丢了,变成了直接对 `triangle` 整个 ...

你个假ai,你修正后的代码和原来答案的代码结果是一样的。
其实真正的问题出在这一行
      print(f"{num:5d}", end="")
解释一下这行代码是什么意思?

FishC 发表于 前天 17:10

liupu65 发表于 2026-10-09 17:10
FishC 发表于 2026-10-9 16:55
这段“答案代码”不能 ...

哈哈,被你看穿了,前面确实绕远了。真正要解释的就是这行:

print(f"{num:5d}", end="")

拆开看:

1. f"{num:5d}" 是 Python 的 f-string 格式化字符串。
2. {num:5d} 表示把变量 num 按“十进制整数、宽度 5”的格式变成字符串。
   - d 表示十进制整数。
   - 5 表示总宽度至少 5 个字符。
   - 默认右对齐,不够就在左边补空格。
   - 比如 num = 1,结果是 "    1",前面 4 个空格。
   - num = 123,结果是 "123",前面 2 个空格。
3. end="" 表示打印完不换行,也不额外加字符。这样同一行的多个数字会连续打印,不会每个数字占一行。

所以这行的作用是:把当前数字按固定宽度打印出来,并且不换行,让杨辉三角每行数字对齐好看。

你之前答案里的 print(triangle, end='\t') 如果 triangle 是二维列表,会打印整个列表;如果写成正确索引 triangle,再用 \t 也能对齐。两种方式目标一样,只是控制对齐的手段不同。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 杨辉三角萌新求助