【Python实现杨辉三角】
目錄
什么是楊輝三角
楊輝三角解法
1. 定義法
2. 計算楊輝三角 補0法
?3. 楊輝三角,對稱法
?4. 楊輝三角,單列表方法
5.列表嵌套(二維數組)
6. 新舊兩行,一次性開辟新行
7.yield函數
8.zip函數
參考資料鏈接:
一、什么是楊輝三角
楊輝三角,是二項式系數在三角形中的一種幾何排列,中國南宋數學家楊輝1261年所著的《詳解九章算法》一書中出現。在歐洲,帕斯卡(1623----1662)在1654年發現這一規律,所以這個表又叫做帕斯卡三角形。帕斯卡的發現比楊輝要遲393年,比賈憲遲600年。
楊輝三角_百度百科
?
楊輝三角的性質:
每個數字等于上一行的左右兩個數字之和。即第n+1行的第i個數等于第n行的第i-1個數和第i個數之和。
為了解決這個問題,并了解更多的解法,我在網上查找了一些資料,將解法進行了匯總
二、楊輝三角解法
1. 定義法
思路:
從第三行開始,每一行的首尾都是1,中間部分每個數字等于上一行的左右兩個數字之和。先定義每一行的第一個數字,然后在利用規則對中間部分進行運算,最后再添加最后一個元素。
PS:這個解法還是比較容易想出來的
代碼:
# 計算楊輝三角 定義法 n = eval(input("輸入要打印的行數:")) triangle = [[1], [1, 1]] for i in range(2, n): # 已經給出前兩行,求剩余行pre = triangle[i-1] # 上一行cul = [1] # 定義每行第一個元素for j in range(i-1): # 算幾次cul.append(pre[j]+pre[j+1]) # 每個數字等于上一行的左右兩個數字之和。cul.append(1) # 添加每行最后一個元素triangle.append(cul) print("普通輸出:{}".format(triangle)) for i in range(n): # 按等邊三角形格式輸出s = " "*(n-i-1)for j in triangle[i]:s = s + str(j)+" "print(s)運行結果
定義法也可以使用下面這種形式,先給出一個空列表,通過循環先進行追加列表,在對列表進行修改
代碼
n = eval(input()) triangle = [] for i in range(n):cur = [1]triangle.append(cur) #先追加進去if i == 0:continuepre = triangle[i-1]for j in range(i-1):cur.append(pre[j] + pre[j+1])cur.append(1) print(triangle)2.?補0法
補零法是在定義法的基礎上,通過對上一行加[0],那么每行只需定義每行的第一個元素,這一行的其余元素可以通過上一行的左右兩個元素相加得到。值得注意的是補零只是對中間的過程變量進行補零,不影響輸出結果。
代碼
# 計算楊輝三角 補0法 triangle = [[1]] n = eval(input("輸入行數:")) for i in range(1, n):swap = triangle[i-1]+[0]cul = [1]for j in range(len(swap)-1):cul.append(swap[j]+swap[j+1])triangle.append(cul) print(triangle)運行結果
?
3.對稱法
思路
中點的確定:
代碼:
# 楊輝三角,對稱法 n = eval(input("輸入要打印的行數:")) triangle = [[1], [1, 1]] for i in range(2, n):tmp = triangle[-1]#上一個列表cul = [1] * (i+1)for j in range(i//2): #有圖知:大概的臨界值為一半,再仔細推敲cul[j+1] = tmp[j]+tmp[j+1]if i != 2j:#當j不為中點時cul[-j-2] = cul[j+1]triangle.append(cul) print(triangle)運行結果
4. 楊輝三角,單列表方法
代碼
# 楊輝三角,單列表解決 n = eval(input("輸入要打印的行數:")) row = [1] * n for i in range(n):z = 1offset = n - ifor j in range(1, i//2+1):val = z + row[j]z = row[j]row[j] = valif i != 2*j:row[-j - offset] = valprint(row[:i+1])運行結果
5.列表嵌套(二維數組)
概念:list1[n][m] = list1[n-1][m-1] + list1[n-1][m]
代碼
n=int(input()) list1=[] for n in range(n):row=[1] # 第一行第一列為1list1.append(row)if n==0:for num in row: # 這里主要是為輸出做的格式處理print(num,end=" ")print()continuefor m in range(1,n):row.append(list1[n-1][m-1]+list1[n-1][m])row.append(1)for num in row:print(num, end=" ")print()這個方法利用List列表將二維數組進行實現
6. 新舊兩行,一次性開辟新行
代碼
m = eval(input("輸入要輸出的行數:")) # 新舊兩行,一次性開辟新行 ordline = [] for i in range(m):newline = [1] * (i+1)for j in range(2, i+1):newline[j-1] = oldline[j-1]+oldline[j-2]oldline = newlineprint(newline)運行結果
?其中通過計算比較,第五種方法一次性開辟內存空間的方法要比第一種方法中,每次計算通過append添加新的內存空間要快。
7.yield函數
利用yield函數可以將L定義為生成器
代碼
def triangles():L = [1] #定義L為一個只包含一個元素的列表while True:yield L #定義為生成器函數L =[1] + [L[n] + L[n-1] for n in range(1,len(L))] + [1]n = 0 for t in triangles():print(t)n = n + 1if n == 10:break8.zip函數
zip()?函數用于將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表。
如果各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操作符,可以將元組解壓為列表。
思路
?楊輝三角特性:
代碼
def triangles():n = [1]while True:yield nn = [x+y for x,y in zip([0] + n,n+[0])]n = 0 for t in triangles():print(t)n = n + 1if n == 10:break?運行結果
?
參考資料鏈接:
楊輝三角的幾種解法(python)_vampire's blood的博客-CSDN博客_楊輝三角python
python——楊輝三角 - 我聽過 - 博客園
python打印楊輝三角的兩種方法及詳解 - 簡書
楊輝三角形(超級簡單的Python實現方法)_3Sunremitting的博客-CSDN博客_python楊輝三角
Python yield 使用淺析 | 菜鳥教程
Python3 zip() 函數 | 菜鳥教程
總結
以上是生活随笔為你收集整理的【Python实现杨辉三角】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wget下载网络资源
- 下一篇: 蓝桥杯基础练习 杨辉三角形Python实