标签:完全 思路 修改 可变 需要 代码 杨辉三角 app 构造
##########杨辉三角思路########1 n=0
1 1 n=1
1 2 1 n=2
1 3 3 1 n=3 中间项的数量= n-1
1 4 6 4 1 n=4
1 5 10 10 5 1 n=5 共六项 前六行
第一行和第二行是特殊项 不做讨论 直接定义
num = [1,[1,1]]
从第二行开始,每一行的首尾都是1 中间项 为前一行列表的 两个相邻的数字之和
num = [1,[1,1]]
for i in range (2,6): ##取 1到5
为了构造新的一行,需要提取出num列表中的前一项 也就是 num[i-1]
list.up = num[i-1] ### [1,1]
拿到这个值后看怎么用这个值,通过分析我们发现每一行的列表都有一个性质,就是首尾都为1 [1,....,1]
所以我们需要首先构造出[1,....,1]
new.list = [1]
# 然后在这个 new.list 后边追加 中间项 再追加[1]
所以这时候要分析中间项; 中间项是一个可迭代的项 和n有关系 不是定值 所以需要使用循环来完成构造
for j in range (0,i-1): 取值范围的确定是由小范围值确定的通过[1,1]-->[1,2,1] 可知:
midd = pre [j] + pre [j+1]
中间项和第一项都有了以后开始追加 new.list.append(midd)
new.list.append(1)
num.append(new.list)
代码:
num = [1,[1,1]]
for i in range (2,6):
pre = num[i-1]
cur = [1]
for j in range (0,i-1):
cur.append(pre[j] + pre [j + 1])
cur.append(1)
num.append(cur)
print (num)
另一种表达形式: (cur是一个可变的列表,可以随时在任何地方修改该列表的值)
num = []
for i in range (6):
cur = [1]
num.append(cur)
if i == 0: continue
pre = num[i-1]
for j in range (i-1):
cur.append(pre[j] + pre [j + 1])
cur.append(1)
print (num)
另一种表达形式: 这个方法是 我先构造一个 num=[[1]] 然后通过i的值来判定到底要不要再尾部追加 如果 i<0 也就是第一行 那就直接输出[1],如果i>1了 那就找中间项
num = []
for i in range (6):
cur = [1]
num.append(cur)
#if i == 0: continue
# pre = num[i-1]
for j in range (i-1):
cur.append(num[i-1][j] + num[i-1][j + 1])
if i > 0 :
cur.append(1)
print (num)
######## 方法二#########################
补零法: 1 0 n= 0
1 1 0
1 2 1 0
1 3 3 1 0
1 4 6 4 1 0 n= 5
结题思路:
将每行列表进行补零 可以总结出规律如下
第一个数字 :上一行(num[-1]+num[0])
第二个数字: 上一行(num[1]+num[2])
..................................
最后一个数字: 上一行 (num[i-1]+num[-1])
首先 需要构造一个原始列表: num = [[1],[1,1]]
第三行的前一项 表示为 pre = num [i-2] --> [1,1]
然后给这一行的尾部加零,构造一个新的列表,但是我们需要最后显示的列表中不能有零的存在,所以必须构造一个新的列表。
newlist = pre . copy ()
newlist .append (0) 也可以直接表示为 newlist = pre + [0]
mid =[ ] 创造一个新列表 来放新列表的内容
构造新数列后,需要用构造下一行列表, 根据规律可以得到 i=2 需要计算三次 所以要循环 i+1 次
for j in range (i+1):
mid.append(newlist[j-1]+newlist[j])
代码:
n = [[1],[1,1]]
for i in range (2,6):
pre = n[i-1] + [0]
# pre=pre.copy()
# pre.append(0)
mid = []
for j in range (i+1):
mid.append(pre[j-1]+pre[j])
num.append(mid)
print(num)
################方法三###################
对称性:
1 n=0
1 1 n=1
1 2 1 n=2
1 3 3 1 n=3 中间项的数量= n-1
1 4 6 4 1 n=4
1 5 10 10 5 1 n=5 共六项 前六行
通过分析可知,杨辉三角可以看做是关于中点对称的列表的集合,遇到对称性列表问题时,同时通过观察可知该列表的规律,可以采用一次性开辟对应空间的列表,然后在列表中增删元素
n = 6
taiangel = [[1],[1,1]]
for i in range (2,n):
row = [1] * (i+1) ###通过规律可知 第3行 即n=2 该行共有3个元素 所以一次性开辟 [1] * (i+1) 个元素
pre = taiangel[i-1]
=======================到此为止,已经可以成立一个新的列表,元素站位已经有了,差的是把先关的值填进去===================================================
通过观察可知每一行要添加的元素是由规律的 n=2 要添加1个元素
n=3 要添加1个元素 (因为 3和3 可以当一个元素 利用对称性完成)
n=4 要添加2个元素 (4和6两个元素)
n=5 要添加2个元素 (5和10两个元素)
。。。。。。。。。。。。。。
得出结论: j的迭代次数为 (n//2)
for j in range (i//2):
val= pre[j] + pre[j+1] ###计算中间项的值 但是这里没有考虑到n=3这样的特例,只添加一个元素但是该元素要关于中点对称;
i=2 j=1 val= pre[0] + pre[1] = 1+1 =2 row[1]
i=3 j=1 val=pre[0]+pre[1]=3 row[1]
i=4 j=2 val=pre[0]+pre[1]=4 row[1]
val=pre[1]+pre[2]=6 row[2] row[j+1]
val = pre[j] + pre[j+1]
row[j+1] = val 程序进行到这里的时候还没有完全成功 对称元素就只更改了一项 另一项还是1没有改。
if i != 2j :
row[-j-2] = val 通过判定 当 i!= 2j 时 倒数第二 第三个元素 要和val相等
taiangel.append(row)
print(taiangel)
相关代码:
## 杨辉三角对称性
n = 8
triangle = [[1],[1,1]] 1 i=0 第一行 i+1
for i in range (2,n): 1 1 i=1
row = [1] * (i+1) 1 2 1 i=2
pre = triangle[i-1] 1 3 3 1 i=3
for j in range (i//2): #2 1 4 6 4 1 i=4 第五行 i+1
val = pre[j] + pre[j+1] #4 需要想 i 和 j 的关系 j还要表示row[j] j==1 现在 i=2 j=1//2 for j in range (2):
row[j+1]=val row(j+1) = pre(j)+pre(j+1)
if i != 2j : #j=0
row[-j-2] = val
triangle.append(row)
print(triangle)
标签:完全 思路 修改 可变 需要 代码 杨辉三角 app 构造
原文地址:http://blog.51cto.com/12950054/2158575