鱼C论坛

 找回密码
 立即注册
查看: 1918|回复: 2

[已解决]有没有大佬看看这样为什么不行

[复制链接]
发表于 2023-4-28 21:42:13 | 显示全部楼层 |阅读模式

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

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

x
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(2,10):
    s[i]=[(s[i-1][j-1]+s[i-1][j]) for j in range(1,i)]
最佳答案
2023-4-28 21:44:55
看起来您想用两种方法计算杨辉三角(Pascal's Triangle)。首先,我们来检查第一种方法:
triangle = [[1] * i for i in range(1, 11)]

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

这种方法的逻辑是正确的。现在,让我们看看第二种方法:
s = [[1] * i for i in range(1, 11)]

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

我发现了两个问题:

1. 您的列表解析没有考虑到行首和行尾的 1。您需要在列表解析之前和之后分别添加 1。
2. 您需要确保  s  列表被初始化为正确的大小,以便在循环中为其分配值。

在解决了这两个问题后,您的代码应该如下所示:
s = [[1] * i for i in range(1, 11)]

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

现在,您的第二种方法应该可以正常工作,得到与第一种方法相同的杨辉三角形。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-28 21:44:55 | 显示全部楼层    本楼为最佳答案   
看起来您想用两种方法计算杨辉三角(Pascal's Triangle)。首先,我们来检查第一种方法:
triangle = [[1] * i for i in range(1, 11)]

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

这种方法的逻辑是正确的。现在,让我们看看第二种方法:
s = [[1] * i for i in range(1, 11)]

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

我发现了两个问题:

1. 您的列表解析没有考虑到行首和行尾的 1。您需要在列表解析之前和之后分别添加 1。
2. 您需要确保  s  列表被初始化为正确的大小,以便在循环中为其分配值。

在解决了这两个问题后,您的代码应该如下所示:
s = [[1] * i for i in range(1, 11)]

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

现在,您的第二种方法应该可以正常工作,得到与第一种方法相同的杨辉三角形。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-28 21:45:41 | 显示全部楼层
问题出现在您的第二个代码段中,具体来说是 `s[i-1][j-1]` 的下标超出了指定的范围。对于 `i` 等于 2 的情况, `s[1]` 是一个空列表,并且您将尝试访问 `s[1][-1]` 去做加法运算,因为您在 `range(1, i)` 中使用了 `j - 1`。

为了解决这个问题,您可以修改循环以避免访问不存在的索引。以下是您可能想要尝试的更改后的代码:
s = [[0] * i for i in range(1, 10)]
for i in range(1, 10):
    for j in range(i):
        if j == 0 or j == i-1:
            s[i-1][j] = 1
        else:
            s[i-1][j] = s[i-2][j-1] + s[i-2][j]

这将创建一个 `s` 列表,并根据需要为其填充必要数量的零。循环将遍历从 1 到 9 的行,然后对于每一行循环遍历从 0 到该行号减去 1 的列。此时,您可以将每个三角形中的值计算为上一行中同一列和前一列的值的和。第一列和最后一列都被直接设置为 1,因为它们始终是三角形的边缘。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 17:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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