# Python怎样实现杨辉三角 杨辉三角(帕斯卡三角)是二项式系数在三角形中的几何排列,具有丰富的数学性质和编程实践价值。本文将介绍三种Python实现方法,并分析其优劣。 ## 一、杨辉三角的数学特性 杨辉三角的第n行(从0开始)对应二项式$(a+b)^n$展开的系数,具有以下性质: 1. 每行首位和末位为1 2. 其余每个数等于它上方两数之和 3. 第n行有n+1个元素 ## 二、基础实现方法 ### 方法1:嵌套列表法 ```python def pascal_triangle(n): triangle = [] for i in range(n): row = [1] * (i + 1) for j in range(1, i): row[j] = triangle[i-1][j-1] + triangle[i-1][j] triangle.append(row) return triangle # 打印前6行 for row in pascal_triangle(6): print(row) 优点:直观易理解,直接体现数学定义
缺点:空间复杂度O(n²)
def pascal_triangle_gen(n): row = [1] for _ in range(n): yield row row = [1] + [row[i] + row[i+1] for i in range(len(row)-1)] + [1] # 使用示例 for row in pascal_triangle_gen(5): print(row) 优点:内存高效,适合大三角计算
缺点:无法随机访问特定行
利用组合数公式\(C(n,k) = \frac{n!}{k!(n-k)!}\)实现:
from math import comb def pascal_comb(n): return [[comb(i, j) for j in range(i+1)] for i in range(n)] # 示例输出 print(pascal_comb(5)) 优点:数学表达简洁
缺点:重复计算阶乘,效率较低
from functools import lru_cache @lru_cache(maxsize=None) def fact(n): return 1 if n < 2 else n * fact(n-1) def pascal_memo(n): return [[fact(i)//(fact(j)*fact(i-j)) for j in range(i+1)] for i in range(n)] 实现美观的等腰三角形输出:
def print_pretty(triangle): max_width = len(' '.join(map(str, triangle[-1]))) for row in triangle: print(' '.join(map(str, row)).center(max_width)) # 使用示例 print_pretty(pascal_triangle(6)) 输出效果:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 | 方法 | 时间复杂度 | 空间复杂度 | 适用场景 |
|---|---|---|---|
| 嵌套列表 | O(n²) | O(n²) | 需要完整三角 |
| 生成器 | O(n²) | O(n) | 逐行处理 |
| 组合数公式 | O(n³) | O(n²) | 小规模计算 |
| 记忆化组合数 | O(n²) | O(n²) | 需要多次重复计算 |
不同实现方式各有优劣,建议根据实际需求选择。生成器版本在大多数场景下表现最优,兼顾了内存效率和代码可读性。理解杨辉三角的实现有助于培养递归思维和动态规划思想。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。