当前位置: 首页 > news >正文

别光打印三角形了!用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 1

2.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)) # 输出10

4. 性能优化与工业级实现

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在科学计算领域的独特优势。

http://www.jsqmd.com/news/666512/

相关文章:

  • SAP SD VL31N BAPI翻车实录:BBP_INB_DELIVERY_CREATE创建内向交货单,物料号神秘消失的坑我帮你填了
  • 5大核心功能彻底解决泰坦之旅物品管理难题:TQVaultAE终极解决方案
  • 【2026奇点智能技术大会权威解码】:AGI如何重构物流管理底层逻辑——3大颠覆性落地路径首次公开
  • LVGL按键驱动配置实战:从引脚初始化到事件映射
  • MATLAB代码之光场调控非线性光学仿真——实现傅立叶算法解析非线性薛定谔方程的研究者宝典
  • 电脑突然开不了机?别急着换CPU,先检查这个12V小水泵(附拆解图)
  • 高精度电涡流传感器|深圳市勤联科技 - 品牌推荐大师
  • 如何彻底解锁泉盛UV-K5/K6对讲机的终极潜能:LOSEHU固件完全指南
  • 盘点不错的斗齿生产厂家,教你如何选择靠谱品牌 - 工业品网
  • 《从伯努利到库塔-茹科夫斯基:无黏流动的工程实践与升力奥秘》
  • 逆向实战:我是如何一步步破解Vaptcha手势验证码的图片乱序算法的
  • 拯救你的图表颜值:Matplotlib中plt.title()的5个实用技巧(含常见排版错误避坑)
  • 从程序乱飞到集中管理:用FTP给西门子840D sl数控系统做个“云盘”
  • 2026性价比高的报考注册消防安全管理人实操培训机构推荐,怎么选择 - mypinpai
  • Manjaro新手避坑指南:搞定‘签名未知信任’和‘包结构错误’的保姆级教程
  • Windows平台Android应用安装革命:APK-Installer全解析
  • Pixeval完整教程:打造高效Pixiv浏览体验的终极指南
  • 别再乱装protobuf了!聊聊C++项目依赖管理中protoc版本锁定的那些坑
  • 从仿真到实战:解析XAPP1171中AXI-CDMA的数据搬运机制
  • 魔兽争霸3终极优化方案:WarcraftHelper让你的经典游戏焕然一新
  • 分享一下笔者的 Mac 装机必备软件
  • 半导体设备通讯必备:SML格式详解与实战解析(附XML示例)
  • 别再死记硬背公式了!用Python+ADS仿真,5分钟搞定L型阻抗匹配电路设计
  • 基于Simulink的PMSM矢量控制(FOC)从零搭建
  • 期末求生指南:手把手教你用浏览器开发者工具绕过百一测评切屏检测
  • SliderCaptcha终极指南:5分钟构建Web安全验证解决方案
  • 2026年3月网架生产厂家推荐,美观与实用,网架兼具双重优势 - 品牌推荐师
  • 智慧博物馆预约系统|基于java+ vue智慧博物馆预约系统(源码+数据库+文档)
  • 用PYNQ-Z2开发板+OpenCV,手把手教你DIY一个车牌识别系统(附完整Python代码)
  • c++怎么只读取文本文件的最后一行_反向指针与逆序搜索【进阶】