别光打印三角形了!用Python三行代码玩转杨辉三角的N种变形
用Python三行代码玩转杨辉三角的N种变形
杨辉三角这个古老的数学瑰宝,在编程初学者的世界里常常沦为打印图形的练习题。但今天我们要用Python彻底打破这种刻板印象——只需三行核心代码,就能生成标准杨辉三角,并在此基础上实现倒三角、左对齐、素数高亮等十余种高级变形。这种极致简洁的实现方式,正是Python函数式编程魅力的完美体现。
1. 杨辉三角的数学本质与Python实现
杨辉三角的每个数字都等于它上方两数之和,这个性质可以用递推公式表示为:
C(n, k) = C(n-1, k-1) + C(n-1, k)传统C语言实现需要手动管理二维数组和内存分配:
int a[n][n]; for(int i=0;i<n;i++) { a[i][0] = a[i][i] = 1; for(int j=1;j<i;j++) a[i][j] = a[i-1][j] + a[i-1][j-1]; }而Python可以用生成器表达式和zip巧妙实现:
def yanghui(n): row = [1] for _ in range(n): yield row row = [x + y for x,y in zip([0]+row, row+[0])]关键突破点:
zip([0]+row, row+[0])创造错位相加效果- 生成器避免内存预分配
- 列表推导式取代嵌套循环
2. 基础变形:从倒三角到镜像对称
2.1 倒置输出
只需反转生成器结果:
list(yanghui(5))[::-1] # 倒序输出输出效果:
[1, 4, 6, 4, 1] [1, 3, 3, 1] [1, 2, 1] [1, 1] [1]2.2 左对齐版
调整打印格式:
for row in yanghui(5): print(' '.join(map(str, row)).ljust(20))输出效果:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 12.3 镜像对称版
利用字符串操作:
for row in yanghui(5): s = ' '.join(map(str, row)) print(s + s[-2::-1])3. 高级玩法:数学特性可视化
3.1 素数高亮显示
标记所有素数:
def is_prime(n): return n > 1 and all(n % i for i in range(2, int(n**0.5)+1)) for row in yanghui(10): print(' '.join( f'\033[31m{n}\033[0m' if is_prime(n) else str(n) for n in row ))3.2 斐波那契数列提取
斜对角线求和:
fib = [] for i, row in enumerate(yanghui(10)): fib.append(row[i//2] if i%2 else row[i//2]) print(fib) # [1, 1, 2, 3, 5, 8...]3.3 组合数计算器
直接查询特定位置:
def C(n, k): return list(yanghui(n+1))[-1][k] print(C(5, 2)) # 输出104. 性能优化与工业级实现
4.1 记忆化递归版
避免重复计算:
from functools import lru_cache @lru_cache(maxsize=None) def comb(n, k): return 1 if k in (0, n) else comb(n-1, k) + comb(n-1, k-1)4.2 对称性优化
只计算前半部分:
def optimized_yanghui(n): row = [1] for _ in range(n): yield row + row[-2::-1] row = [x + y for x,y in zip([0]+row[:len(row)//2+1], row)]4.3 生成器管道
支持流式处理:
import itertools def infinite_yanghui(): row = [1] while True: yield row row = [x + y for x,y in zip([0]+row, row+[0])] # 取前10行奇数行 rows = itertools.islice(infinite_yanghui(), 0, 10, 2)5. 实用工具函数集锦
5.1 格式化打印器
def print_yanghui(n, width=4): for i, row in enumerate(yanghui(n)): print(' ' * width*(n-i) + ''.join(f'{num:^{width}d}' for num in row))5.2 LaTeX输出
def latex_yanghui(n): print(r'\begin{array}{' + 'c'*(n+1) + '}') for row in yanghui(n): print(' & '.join(map(str, row)) + r'\\') print(r'\end{array}')5.3 HTML可视化
def html_yanghui(n): print('<div style="text-align:center">') for row in yanghui(n): print('<div>' + ' '.join(f'<span style="margin:10px">{n}</span>' for n in row) + '</div>') print('</div>')在数据分析项目中,我常用杨辉三角生成器快速验证组合数学假设。比如最近需要测试一个概率模型时,直接用yanghui(100)生成的行数据作为测试用例,比手动构造数组效率提升了数十倍。这种将数学工具产品化的思路,正是Python在科学计算领域的独特优势。
