杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉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. [性能优化] perf 高级用法:完整记录程序性能指标,并按照时间段对程序进行有针对性的性能分析

    如题: 假设你已经熟悉了基本用法,知道perf是干嘛的,以及会用 perf top [性能优化] perf 背景:目标程序在运行的某时间段内会出现性能下降,需要了解这个时间内,程序发生了什么. 方法: ...

  2. RENAME方法进行分区改造

    1.新建零时表 set time on timing on create table RPTUSER.RPT_TMP_10086BDL_bak ( HANDLEDATE DATE, TEL_CALLI ...

  3. LeetCode 292 Nim Game 解题报告

    题目要求 You are playing the following Nim Game with your friend: There is a heap of stones on the table ...

  4. 解决双系统(Window10+Ubuntu16.10)下ubuntu安装git时提示软件包git没有可安装候选问题

    选择升级系统: sudo apt-get update 升级之后再输入: sudo apt-get install git 可成功安装.

  5. 【PyQt5-Qt Designer】界面布局

    PyQt5 界面布局详谈 箱式布局 QHBoxLayout和QVBoxLayout是基本的布局类,它们在水平和垂直方向上排列小部件 效果图: from PyQt5.QtCore import Qt f ...

  6. dispatch_queue_set_specific可重入的gcd

    有时候我们很希望知道当前执行的queue是谁,比如UI操作需要放在main queue中执行.如果可以知道当前工作的queue是谁,就可以很方便的指定一段代码操作在特定的queue中执行.这种做法让G ...

  7. gitlab小结

    部署Gitlab环境完整记录(我用的是11版本的gitlab,为了后面不出现bug,请选择11) gitlab启用https的配置 gitlab强制修改密码 https://www.cnblogs.c ...

  8. VS Code 添加移除asp.net core项目引用

    可以通过编辑.csproj文件来添加或者移除项目引用. 注意这里并没有智能提示, 最好是在Nuget网站(https://www.nuget.org/)搜索好相关包之后填写进来. 编辑结束之后, vs ...

  9. 20190228 搭建Hadoop基础环境

    下载VMware 12 版本以上 下载CentOS 7以上版本 安装虚拟机,安装系统时,注意设置root 账号和密码 虚拟机配置网络,命令ip addr 查看IP 地址,(配置网络网上有很多办法,百度 ...

  10. js小数点精度问题

    项目背景是用eharts 渲染数据,其中Y 轴的 刻度尺间隔用 interval,代码中如下: yAxis: [ { type : 'value', position:'left', min:minV ...