目次
1.陽会三角形とは
楊恵の三角形は、南宋時代の数学者である楊恵が1261年に著した著書「九章アルゴリズムの詳細解説」に登場する二項係数を三角形に幾何学的に配置したものです。ヨーロッパではパスカル(1623-1662)が1654年にこの法則を発見したことから、この表はパスカルの三角形とも呼ばれています。パスカルの発見は、ヤン・ホイの発見より393 年遅く、ジャ・シャンの発見より 600 年遅かった。
ヤン・ホイ・トライアングル - Alchetron, The Free Social Encyclopedia
な
陽輝三角形の性質:
各数値は、前の行の左と右の数値の合計に等しくなります。つまり、行 n+1 の i 番目の数は、行 n の i-1 番目の数と i 番目の数の和に等しくなります。
この問題を解決し、より多くの解決策を学ぶために、インターネットでいくつかの情報を検索し、解決策をまとめました
2.陽輝三角解
1. 定義
アイデア:
3 行目以降、各行の最初と最後は 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:
continue
pre = 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 = 1
offset = n - i
for j in range(1, i//2+1):
val = z + row[j]
z = row[j]
row[j] = val
if i != 2*j:
row[-j - offset] = val
print(row[:i+1])
運用実績
5. リストの入れ子 (2 次元配列)
概念: list1[n][m] = list1[n-1][m-1] + list1[n-1][m]
コード
n=int(input())
list1=[]
for n in range(n):
row=[1] # 第一行第一列为1
list1.append(row)
if n==0:
for num in row: # 这里主要是为输出做的格式处理
print(num,end=" ")
print()
continue
for 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 リストを使用して 2 次元配列を実現します。
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 = newline
print(newline)
運用実績
その中で、計算と比較を通じて、一度にメモリ空間を開く 5 番目の方法は、計算ごとに追加して新しいメモリ空間を追加する 1 番目の方法よりも高速です。
7.利回り関数
L は、yield 関数を使用してジェネレーターとして定義できます。
コード
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 + 1
if n == 10:
break
8.zip機能
zip() 関数は、反復可能なオブジェクトをパラメーターとして受け取り、オブジェクト内の対応する要素をタプルにパックしてから、これらのタプルで構成されるリストを返すために使用されます。
各反復子の要素数が一致しない場合、返されるリストの長さは最短のオブジェクトと同じであり、タプルは * 演算子を使用してリストに解凍できます。
一連の考え
陽輝の三角形の特徴:
コード
def triangles():
n = [1]
while True:
yield n
n = [x+y for x,y in zip([0] + n,n+[0])]
n = 0
for t in triangles():
print(t)
n = n + 1
if n == 10:
break
運用実績
参考リンク:
ヤン・ホイの三角形のいくつかのソリューション (python)_吸血鬼の血のブログ - CSDN ブログ_ヤン・ホイの三角形 python
ニシキヘビ——陽輝三角 - 聞いたことがあります - Blog Garden
PythonでYang Huiの三角形を出力する2つの方法と詳しい解説 - Programmer Sought
陽輝三角形(超簡単なPython実装方法)_3サンレミティングのブログ - CSDNブログ_python 陽輝三角形