鱼C论坛

 找回密码
 立即注册
查看: 34|回复: 7

杨辉三角萌新求助

[复制链接]
发表于 前天 16:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

for i in range(10):
    triangle[i][i] = 1
    triangle[i][0] = 1

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

for i in range(10):
    for j in range(i+1):
        print(triangle[i][j],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[i][j],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[i][j], end='\t')
    print()
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 16:26 | 显示全部楼层
鱼油你好,别急,杨辉三角要分两步:先“生成”,再“打印”。你直接把生成和打印混在一起,所以容易乱。

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

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


  1. n = 10
  2. triangle = []

  3. # 生成杨辉三角
  4. for i in range(n):
  5.     row = [1] * (i + 1)
  6.     for j in range(1, i):
  7.         row[j] = triangle[i-1][j-1] + triangle[i-1][j]
  8.     triangle.append(row)

  9. # 打印杨辉三角
  10. for i in range(n):
  11.     # 前面补空格,让它看起来是三角形
  12.     for k in range(n - i - 1):
  13.         print("   ", end="")
  14.     for num in triangle[i]:
  15.         print(f"{num:5d}", end="")
  16.     print()
复制代码


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

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


  1. for i in range(n):
  2.     for k in range((n - i) // 2):
  3.         print('\t', end='')
  4.     for num in triangle[i]:
  5.         if i % 2 == 1:
  6.             print("    ", end='')
  7.         print(num, end='\t')
  8.     print()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 16:48 | 显示全部楼层
答案的代码为啥错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 16:48 | 显示全部楼层
liupu65 发表于 2026-10-09 16:48
答案的代码为啥错了


答案代码错在两点:

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


  1. triangle = []
  2. for i in range(10):
  3.     row = [1] * (i + 1)
  4.     for j in range(1, i):
  5.         row[j] = triangle[i-1][j-1] + triangle[i-1][j]
  6.     triangle.append(row)
复制代码


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


  1. print(triangle[i][j], end='\t')
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 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[i].append(0)
   
# 计算杨辉三角形
# 根据观察,我们知道杨辉三角形左右两边的元素均为1
for i in range(10):
    triangle[i][0] = 1
    triangle[i][i] = 1
   
# 第i行j列的值 = 第(i-1)行(j-1)列的值 + 第(i-1)行(j)列的值
for i in range(2, 10):
    for j in range(1, i):
        triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]

# 输出杨辉三角形
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[i][j], end='\t')
    print()

答案的代码是这样的,就会出错,你的代码是对的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 16:55 | 显示全部楼层
liupu65 发表于 2026-10-09 16:55
FishC 发表于 2026-10-9 16:26
鱼油你好,别急,杨辉 ...


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

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

2. 设置两边为 1 时:  
   triangle = 1 应该是 triangle[i][0] = 1  
   triangle = 1 应该是 triangle[i][i] = 1

3. 计算中间值时:  
   triangle = triangle + triangle 应该是  
   triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]

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

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


  1. # 初始化 10x10 二维列表,全部填 0
  2. triangle = []
  3. for i in range(10):
  4.     triangle.append([])
  5.     for j in range(10):
  6.         triangle[i].append(0)

  7. # 设置每行两边为 1
  8. for i in range(10):
  9.     triangle[i][0] = 1
  10.     triangle[i][i] = 1

  11. # 计算中间值
  12. for i in range(2, 10):
  13.     for j in range(1, i):
  14.         triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]

  15. # 输出
  16. for i in range(10):
  17.     for k in range((10 - i) // 2):
  18.         print('\t', end='')
  19.     for j in range(i + 1):
  20.         if i % 2 == 1:
  21.             print("    ", end='')
  22.         print(triangle[i][j], end='\t')
  23.     print()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你个假ai,你修正后的代码和原来答案的代码结果是一样的。
其实真正的问题出在这一行
        print(f"{num:5d}", end="")
解释一下这行代码是什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 17:10 | 显示全部楼层
liupu65 发表于 2026-10-09 17:10
FishC 发表于 2026-10-9 16:55
这段“答案代码”不能 ...


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

  1. 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[i][j],再用 \t 也能对齐。两种方式目标一样,只是控制对齐的手段不同。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-10-11 00:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表