杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年

第一种解决方法:

1.一次性开辟每行的内存空间

2.利用对称性解决

triangle = []
n = 6
for i in range(n):
#row 定义了left的1 ,索引第二层循环的范围就是i,第0行0个值,第一行1个值,第二行2个值
row = [1]
#此层循环每层的个数,抛除已经定好的1,当2行i=1,k=0.实际一个空位
#k=i-1的时候填充1,不等的时候填充0
for k in range(i):
if k == i-1:
row.append(1)
else:
row.append(0)
#每行都是1 然后append到triangle,因为列表调用列表,所以更改row就好了(浅copy)
triangle.append(row)
#特殊情况,当i=0的时候 跳过本次循环,进行下一次循环i = 1
if i == 0:
continue
#找对称,前2行特殊情况,i=0 or i=1 带入此循环不执行,第三行的时候就对称只有一个,第四行的时候
#对称还是一个,第五行的时候对称是2个,对称的时候划一条竖线分析,排除左右2边的1
for j in range(i//2):
#第三层通过第2层的2个数相加,然后更改对应的值,
value = triangle[i-1][j]+triangle[i-1][j+1]
row[j+1] = value
#利用负索引找到对应的位置把value的值赋值
row[-j-2]=value
print(triangle)
triangle = []
n = 6
for i in range(n):
row = [1]*(i+1)
triangle.append(row)
for j in range(i//2):
vaule = triangle[i-1][j]+triangle[i-1][j+1]
row[j+1]=vaule
row[-j-2]=vaule
print(triangle)

第二种方法:

1.下一行依赖上一行所有元素,是上一行所有元素的两两相加的和,再在两头各加1。

#把前2行特殊情况单独拿出,用列表嵌套来表示
triangle = [[1],[1,1]]
#从第三行开始循环
for i in range(2,6):
#定义新列表放每行的数字元素
newline = []
#每行先从空列表append 一个1 [1]
newline.append(1)
#在每行列表中增加对应的数字,i行应该有i个数字,但是已经定义好了左侧第一个元素为1 ,所以range(i)
for j in range(i-1):
#i行的j元素等于(i-1)行的值相加
value = triangle[i-1][j]+triangle[i-1][j+1]
newline.append(value)
#填充右侧的1
newline.append(1)
triangle.append(newline)
print(triangle)
triangle = []
n = 6
for i in range(n):
newline = [1]
triangle.append(newline)
if i == 0:
continue
for j in range(i-1):
val = triangle[i-1][j]+triangle[i-1][j+1]
newline.append(val)
#利用到了深浅拷贝的知识,复杂列表,调用的引用地址,更改了newline列表 索引triangle列表也随之更改
newline.append(1)
print(triangle)

第三种方法

1.除了第一行以外,每一行每一个元素(包括两头的1)都是由上一行的元素相加得到。如何得到两头的1呢? 目标是打印指定的行,所以算出一行就打印一行,不需要用一个大空间存储所有已经算出的行

triange = [1]
print(triange)
#triange.insert(0,0)
triange.append(0)
n = 6
for i in range(1,n):
newline = []
for j in range(i+1):
value = triange[j]+triange[-j-1]
newline.append(value) print(newline)
triange=newline
# triange.insert(0,0)
triange.append(0)

第四种方式:单行覆盖

1.每次都要在循环里清除列表有点浪费时间,值开辟一个列表,利用对称和覆盖
2.明确最大行的元素个数,前6行最大的元素个数是6个,下一行等于首元素不变覆盖中间元素

#row = [1,1,1,1,1,1]
# n = 6
# [:1] i==0 offset==6 j=range(1,1) jump
# [:2] i==1 offset==5 j=range(1,1) jump
#
# [:3] i==2 offset==4 j=range(1,2)
# [:4] i==3 offset==3 j=range(1,2)
# [:5] i==4 offset==2 j=range(1,3)
# [:6] i==5 offset==1 j=range(1,3)
n = 6
row = [1]*n
for i in range(n):
#4行和6行对称的负所以是-2;-2,-3;定义的偏移量offset和j做运算方便找到符所以的位置
offset = n-i
#所以为1的位置都是1+x,所以z=1是定义第一个1,定义在for循环外,规避覆盖影响
#此处不用z=1来设置临时变量,val=row[0]+row[j]的话 在算到索引位2的时候就错了,因为row[0]是固定值
z = 1
for j in range(1,i//2+1):
val = z+row[j]
row[j],z = val ,row[j]
if i !=2*j:
row[-j-offset] = val
print(row[:i+1])

Python杨辉三角的更多相关文章

  1. python 杨辉三角

    前提:端点的数为1. 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 第n行的数字有n项. 第n行数字和为2n-1. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同 ...

  2. Python杨辉三角算法

    #!/usr/bin/env python # -*- coding: utf-8 -*- def triangles(): n = 1 aboveList = [] while True: if n ...

  3. python 杨辉三角 算法实现

    def triangles(level): n = 1 L = [] while n <=level: if n <= 2: L.append(1) yield L elif n > ...

  4. python 杨辉三角实现逻辑

    程序输出需要实现如下效果: [1] [1,1] [1,2,1] [1,3,3,1] ...... 方法:迭代,生成器 def triangles() L = [1] while True: yiled ...

  5. python 生成器生成杨辉三角

    用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...

  6. python实现杨辉三角

    刚刚学python,原来用c++,Java很轻松实现的杨辉三角,现在用python实现,代码是少了,理解起来却不容易啊. 这里主要用到的Python的生成器. 我们都知道Python有列表解析功能,根 ...

  7. python 实现杨辉三角(依旧遗留问题)

    1 #! usr/bin/env python3 #-*- coding :utf-8 -*- print('杨辉三角的generator') def triangles(): N=[1] while ...

  8. Python之杨辉三角算法实现

    学习了廖雪峰的官方网站的python一些基础,里面有个题目,就是让写出杨辉三角的实现,然后我就花了时间实现了一把.思路也很简单,就是收尾插入0,然后逐层按照杨辉三角的算法去求和实现杨辉三角. 附属代码 ...

  9. 【Python初级】由生成杨辉三角代码所思考的一些问题

    杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / \ ...

随机推荐

  1. EF-CodeFirst-基础

    什么是Code-First Code-First主要用于领域驱动设计.在Code-First方法中,专注于应用程序的域,先开始为域实体创建类,而不是先设计数据库,然后创建与数据库设计相匹配的类.下图说 ...

  2. ORACLE DB体系结构

    . 实例:一组oracle后台进程.线程以及一个共享内存区. 连接:用户进程和实例之间的通信 会话:用户通过用户进程与实例建立的特定连接 参数文件:包含控制文件的位置和名称 分为pfile和spfil ...

  3. redis的基本介绍

    redis是什么? redis是一种菲关系型数据库,存储key-value类型的数据. redis支持的数据类型 这里所说的数据类型其实就是value对应的数据类型.一共有五种: String 1.S ...

  4. VB改写C#

    1.VB的Val()函数 先从程序集中引入Microsoft.VisualBasic命名空间.不过,即便是引入了Microsoft.VisualBasic命名空间,还是不能直接使用像Val()这样的函 ...

  5. 1、 LwIP协议栈规范翻译——简介

    1.简介 在过去几年中,计算机和计算机支持设备接之间的互联到无线网络日趋增加.计算机已经越来越无缝的集成在了日常的设备且价格也在下降.同时,无线网络技术例如蓝牙[HNI+98]和IEEE802.11b ...

  6. block详解

    Objective-C 中 Block 有三种类型: NSStackBlock 存储于栈区 NSGlobalBlock 存储于程序数据区 NSMallocBlock 存储于堆区 block 内部没有引 ...

  7. 【Mock】【接口测试】【面试】mock-server 环境搭建—加分项!

    mock-server 环境搭建 前言 mock 除了用在单元测试过程中,还有一个用途,当前端开发在开发页面的需要服务端提供 API 接口 此时服务端没开发完成,或者说没搭建测试环境,这个时候前端开发 ...

  8. Python day2 基础 2 数据类型

    数据类型初识 1.数字 2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4.(-5+4j)和 ...

  9. 卸载postgresql数据库

    卸载postgresql数据库有两种方法,第一种一个个包卸载,第二种全部卸载.做这些之前请先做好备份,以防意外! 1.1.查询出postgres数据库,用命令rpm -qa |grep postgre ...

  10. 用composer安装laravel-bjyblog

    前面讲了两行命令composer的安装,现在我们来操作一下composer安装基于laravel的博客laravel-bjyblog.测试环境是linux,bt面板,php7.2安装扩展fileinf ...