Python當中關於楊輝三角的列表實現
的一些理解:
感覺楊輝三角的實現至少在前兩行是特殊的。在後面的幾行代碼中我是這樣想的,可以用第n項加第n+1項。兩邊再加上1就可以了罷。兩邊如果都這麽做的話可以實現對稱的操作。
讓我們來實現吧。在實現的過程中想套用一層循環發現難以實現,用兩層試試看。
yh=[[1],[1,1]]
for i in range(2,6):
line=[1]
ls=yh[i-1]
for j in range(len(ls)-1):
line.append(ls[j]+ls[j+1])
line.append(1)
yh.append(line)
print(yh)
#打印n行的楊輝三角
a=int(input(‘請輸入第幾行‘))
for i in range(a-2):
n=y[i+1]
long=len(n)
line=[1]
for j in range(long-1):
line.append(n[j]+n[j+1])
line.append(1)
y.append(line)
print(line)
關於補零的一些想法,在楊輝三角當中,可以將左右兩邊當成多了一個零,在進入下一行的時候就可以看成0+1=1,同理右邊也是一樣,在實際寫代碼中,開始確實是左邊多一個[0]
,右邊多一個[0],但實際操作下來,左邊的[0]可以省去,因為在python當中是有獨特的負索引機制,在右邊的最後一項可以看做是[-1]項,這樣從0開始叠代的話可以從i-1開始
叠代,是一個python的獨特思想。
y=[[1]]
for i in range(1,6):
n=y[i-1]+[0]
l=[]
for j in range (i+1):
l.append(n[j-1]+n[j])
y.append(l)
print(y)
如果用獨特的負索引的話,用對稱性也是可以做出來的也是從-1項開始做起一直做到中間,這就需要在一開始的時候就創建一個剛剛好的列表空間,然後將元素一個一個填充進去
,這種方法就叫做對稱法
y=[[1]]
for i in range(5):
n=y[i]+[0]
line=[1]*(i+2)
for j in range((i+2)//2+1): line[j]=n[j-1]+n[j] line[-j-1]=line[j] y.append(line)
print(y)
其實有這個想法之後實現代碼並不困難,其實這種方法只是一種思想,這更多是為最後一種方法鋪路,前面三種方法可以看出都是引用一個新列表然後將新列表填充到舊列表當中,如果將舊列表直接copy一個新列表這樣可以省去許多冗余量,我們稱這第四種方法為單列覆蓋法。
y=[1]*6
for i in range(6):
long=6-i
tmp=1
for j in range (1,i//2+1):
val=y[j]+tmp
tmp=y[j]
y[j]=val
y[-long-1]=val
print(y[:i+1])
在這裏引用了一個中間變量tmp因為如果不引用的話會造成數據覆蓋,會有人在實際操作中會判斷是奇數列還是偶數列,但是我們在實驗中可以看到其實判斷是多余的,因為完全可以在多余列覆蓋即可。
到現在楊輝三角就差不多完成了。
Python當中關於楊輝三角的列表實現