解法一(目前内存占用最少的解法):
思路:
了解了杨辉三角的图形后,我们发现其两边顶端的值都是1,因此,我们需要开辟一个空间,姑且先用"1"占满此空间,之后只需用其他的值覆盖填充进去,剩余两端的"1",并且杨辉三角有对称的属性,我们只需要打印出前半部分,把后半部分对称过去就好了.
n=int(input('>>>')
row=[1]*n
for i in range(n):
offset=n-i
z=1
for j in range(1,2//i+1):
val=z+row[j]
row[j],z=val,row[j]
if i!=z*j:
row[-j-offset]=val #赋值时要注意是谁的值赋给了谁,先后顺序要搞清楚,顺序不对则打印出来的结果也不对
print(row[:i+1])
详解:
此方法为目前我所学内容中占用内存最少的方法,无需使用append对列表进行追加.
1,输入n
2,让列表row用"1"占满所需要的空间,因为两端均为1
3,在n的循环中可以表示出所需的杨辉三角有n行
4,随着i的增加,所覆盖的"1"的个数越来越多,row里的"1"越来越少,引用offset记录列表中"1"所剩的个数
5,因为每一次都要覆盖row中的"1"以及上次得到的一些数值,所以引用临时变量z来记录被覆盖的值,毕竟我们还要用本次覆盖的值和被覆盖的值二者相加得到下一个数值
6,因其有对称性,我们只需要在i/2中罗列出所要表示的值
7,在循环中,后者的值可以表示为上者的值和前者的值相加,所以引用val为二者相加的值,并且在下一次循环中原有的z的值也相应的被覆盖了,所以思考得到:row[j],z=val,row[j]
8,观察发现,当i不是j的二倍的时候,其是完全对称的,追加条件if,表示为正索引和负索引所指向的数值都是一样的
9,在第一次循环下打印列表的切片
解法二:最朴素的想法,最朴素的解法,从哪里来回哪里去
n=int(input('>>>'))
YangHui=[[1],[1,1]]
for i in range(2,n):
first=[1]
pre=YangHui[i-1]
for j in range(i-1):
val=pre[j]+pre[j+1]
first.append(val)
first.append(1)
YangHui.append(first)
print(YangHui)
解析:
我们无法从前两行中寻找出对应的规律,特殊对待,先让前两行直接保留在杨辉列表中,之后的行可以用(2,n)个循环来表示,首先确定行首一定是一,确定出来first=[1],行尾也是1,在尾部追加1,寻找两个行首和行尾之间的规律,发现必须要利用上一行得出本行,引用变量pre(表示上一行的数值),之后很容易寻找到规律,用一个变量val表示,引入至循环中.
注意点:
注意各个层的关系,哪一行追加哪个数都要清楚明白,一行出错行行出错,逻辑要罗列清楚.