【Pythonでヤン・ホイの三角形を実現】

目次

陽会三角とは

ヤン・ホイ・トライアングル・ソリューション

1. 定義

2. Yang Hui の三角形の補数 0 法を計算する

 3. 陽輝三角形、対称法

 4. 陽輝三角、単卓方式

5. リストの入れ子 (2 次元配列)

6.新旧ライン、新ライン一斉開通

7.利回り関数

8.zip機能

参考リンク:


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 陽輝三角形

Python yield の使用の分析 | 初心者向けチュートリアル

Python3 zip() 関数 | 初心者向けチュートリアル

おすすめ

転載: blog.csdn.net/W_chuanqi/article/details/123679167