パスカルの三角形(楊輝三角形)は、各行の両端が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を使ったパスカルの三角形の生成とさまざまな出力フォーマットの実装例でした。必要に応じて行数や出力形式を変更してお使いください。