Pythonでパスカルの三角形を生成する - 直角・正三角形の出力

パスカルの三角形(楊輝三角形)は、各行の両端が1で、内部の各要素が右上と左上の要素の和となる三角形の配列です。Pythonでこれを生成し、さまざまな形式(直角、正三角形、中央揃え)で出力する方法を紹介します。

基本アルゴリズム(2次元リスト版)

まず、n行n列の2次元リストを0で初期化します。行と列のインデックスを0から始めると、次の関係が成り立ちます。

pascal[row][col] = pascal[row-1][col-1] + pascal[row-1][col]

両端(col=0 または col=row)は常に1です。

# パスカルの三角形を生成(サイズ10)
n = 10
pascal = [[0] * n for _ in range(n)]
for row in range(n):
    pascal[row][0] = 1
    pascal[row][row] = 1
for row in range(2, n):
    for col in range(1, row):
        pascal[row][col] = pascal[row-1][col-1] + pascal[row-1][col]

出力例:直角形(右揃え)

for row in range(n):
    for col in range(row + 1):
        print(pascal[row][col], end=' ')
    print()

出力:

1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 
1 9 36 84 126 126 84 36 9 1 

出力例:正三角形(中央揃え)

各行の前にスペースを挿入して中央揃えにします。

for row in range(n):
    # 先頭の空白
    print(' ' * (n - row - 1), end='')
    for col in range(row + 1):
        print(pascal[row][col], end=' ')
    print()

出力:

         1 
        1 1 
       1 2 1 
      1 3 3 1 
     1 4 6 4 1 
    1 5 10 10 5 1 
   1 6 15 20 15 6 1 
  1 7 21 35 35 21 7 1 
 1 8 28 56 70 56 28 8 1 
1 9 36 84 126 126 84 36 9 1 

出力例:タブ区切り+偶数行オフセット

行番号が奇数の場合に先頭に空白を入れて「千鳥」効果を出します。

for row in range(n):
    # 行の前にタブを挿入(中央揃え用)
    for k in range((n - row) // 2):
        print('\t', end='')
    for col in range(row + 1):
        if row % 2 == 1:
            print(' ', end='')
        print(pascal[row][col], end='\t')
    print()

出力:

					1	
				 1	 1	
				1	2	1	
			 1	 3	 3	 1	
			1	4	6	4	1	
		 1	 5	 10	 10	 5	 1	
		1	6	15	20	15	6	1	
	 1	 7	 21	 35	 35	 21	 7	 1	
	1	8	28	56	70	56	28	8	1	
 1	 9	 36	 84	 126	 126	 84	 36	 9	 1	

NumPy版(簡潔な実装)

NumPyのonesを使って初期化し、同じロジックで計算します。

import numpy as np

n = int(input('行数を入力: '))
mat = np.ones((n, n), dtype=int)
for row in range(2, n):
    for col in range(1, row):
        mat[row, col] = mat[row-1, col-1] + mat[row-1, col]

# 直角形出力
for row in range(n):
    for col in range(row+1):
        print(mat[row, col], end=' ')
    print()

sys.stdoutを使った出力

標準出力に直接書き込む方法もあります。

import sys

data = []
for row in range(10):
    data.append([0]*10)
for row in range(10):
    data[row][0] = data[row][row] = 1
for row in range(2, 10):
    for col in range(1, row):
        data[row][col] = data[row-1][col-1] + data[row-1][col]

for row in range(10):
    for col in range(row+1):
        sys.stdout.write(str(data[row][col]) + ' ')
    sys.stdout.write('\n')

補足:2次元リストの初期化

以下のいずれかで簡単に初期化できます。

# 方法1:内包表記
n = 3
mat1 = [[0]*n for _ in range(n)]
print(mat1)  # [[0,0,0],[0,0,0],[0,0,0]]

# 方法2:NumPy
import numpy as np
mat2 = np.zeros((n, n), dtype=int)   # 0
mat3 = np.ones((n, n), dtype=int)    # 1

以上、Pythonを使ったパスカルの三角形の生成とさまざまな出力フォーマットの実装例でした。必要に応じて行数や出力形式を変更してお使いください。

タグ: Python パスカルの三角形 NumPy アルゴリズム 2次元リスト

6月2日 17:13 投稿