如何使用嵌套for循环填充满足递推规则的n阶矩阵
n*n递推矩阵填充修复方案
你原有代码的核心问题有两个:一是行填充的循环错误嵌套在了第一行初始化的循环内部,执行逻辑完全混乱;二是递推索引关系没理清,强行用切片赋值反而提高了出错概率。
核心规则梳理
先明确0索引下的矩阵赋值规则,和你给出的示例完全匹配:
- 全0初始化矩阵后,所有列索引小于行索引的位置已经天然为0,不需要额外赋值
- 第0行(第一行)的填充逻辑你已经实现正确,单独执行即可
- 对于第j行(j≥1,也就是第二行及以后),列坐标k≥j的位置,取值满足:
M[j,k] = 正上方元素M[j-1,k] + 左上角元素M[j-1,k-1]
修正后代码
from numpy import zeros, sqrt def function(x,n): M = zeros([n,n]) # 生成n*n全0矩阵 a = (1+x)/2 # 第一行初始值计算参数 g = sqrt(x) # 填充第一行 for i in range(n): M[0,i] = a a = (a+g)/2 g = sqrt(a*g) # 从第二行(索引j=1)开始逐行填充 for j in range(1, n): # 仅处理当前行列号≥j的位置,跳过已经是0的下三角区域 for k in range(j, n): M[j, k] = M[j-1, k] + M[j-1, k-1] return M
结果验证
当第一行初始化结果为[1,2,3,4]、n=4时,代码输出为:
[[ 1. 2. 3. 4.] [ 0. 3. 5. 7.] [ 0. 0. 8. 12.] [ 0. 0. 0. 20.]]
和你给出的示例前三行完全匹配,递推逻辑正确。
不要在逻辑不清晰的时候强行用切片批量赋值,逐位置遍历的写法对初学者更友好,索引关系一目了然,也不会出现切片范围写错、越界等问题。等你对索引逻辑足够熟悉之后,再尝试优化成切片写法即可。
内容的提问来源于stack exchange,提问作者Orm
相关产品推荐
相关产品推荐

