python实现杨辉三角形博客园_Python实现杨辉三角
楊輝三角,是二項式系數在三角形中的一種幾何排列。在歐洲,這個表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年發現這一規律的,比楊輝要遲393年,比賈憲遲600年。楊輝三角是中國古代數學的杰出研究成果之一,它把二項式系數圖形化,把組合數內在的一些代數性質直觀地從圖形中體現出來,是一種離散型的數與形的結合。
以下是楊輝三角的大概樣子,n=5
昨天一直在看傳智播客2018年的前端教程,昨天和今天也抽空研究了以下如何用Python實現楊輝三角。
楊輝三角有以下幾點特性:
前提:每行端點與結尾的數為1.
每個數等于它上方兩數之和。
每行數字左右對稱,由1開始逐漸變大。
第n行的數字有n項。
第n行數字和為2n-1。
第n行的m個數可表示為 C(n-1,m-1),即為從n-1個不同元素中取m-1個元素的組合數。
第n行的第m個數和第n-m+1個數相等 ,為組合數性質之一。
每個數字等于上一行的左右兩個數字之和。可用此性質寫出整個楊輝三角。即第n+1行的第i個數等于第n行的第i-1個數和第i個數之和,這也是組合數的性質之一。即 C(n+1,i)=C(n,i)+C(n,i-1)。
(a+b)n的展開式中的各項系數依次對應楊輝三角的第(n+1)行中的每一項。
將第2n+1行第1個數,跟第2n+2行第3個數、第2n+3行第5個數……連成一線,這些數的和是第4n+1個斐波那契數;將第2n行第2個數(n>1),跟第2n-1行第4個數、第2n-2行第6個數……這些數之和是第4n-2個斐波那契數。
將各行數字相排列,可得11的n-1(n為行數)次方:1=11^0; 11=11^1; 121=11^2……當n>5時會不符合這一條性質,此時應把第n行的最右面的數字"1"放在個位,然后把左面的一個數字的個位對齊到十位... ...,以此類推,把空位用“0”補齊,然后把所有的數加起來,得到的數正好是11的n-1次方。以n=11為例,第十一行的數為:1,10,45,120,210,252,210,120,45,10,1,結果為 25937424601=1110。
本來無從下手,但是研究了一種Python解法終于實現:
def YangHui():
a = [1]
while True:
yield a
a = [sum(i) for i in zip([0] + a, a + [0])]
n = 0
for j in YangHui():
print(j)
n += 1
if n == 2:
break
下面,我來解釋以下這段代碼是什么意思:
首先,定義一個函數,然后定義一個列表,a = [1]
然后就是while循環,yield生成器就不多說了。下面的其實也不用多說,主要是這句話:
a = [sum(i) for i in zip([0] + a, a + [0])]
大家知道,sum是計算符號,而zip是打包列表的用法。但是我看了很久看不懂什么意思,直到我一步步推演:
a = [1]
a = [0,1]+[1,0] = [1,1]
a = [0,1,1]+[1,1,0]==[1,2,1]
a = [0,1,2,1]+[1,2,1,0]=[1,3,3,1]
a = [0,1,3,3,1]+[1,3,3,1,0]=[1,4,6,4,1]
這種解法非常巧妙,他利用zip打包兩個數組,再利用2個0,錯位相加,從而實現了楊輝三角,解題者非常聰明,而我卻很笨,看了很久才明白。
總結
以上是生活随笔為你收集整理的python实现杨辉三角形博客园_Python实现杨辉三角的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 模拟拖动_2020电工(中级)模
- 下一篇: 10个理由告诉你为何要学Java编程?