Pythonで二項係数を使ってカタラン数を計算する方法
カタラン数(Catalan number)は、組み合わせ論においてさまざまな場面で登場する有名な数列です。例えば、正しく対応した括弧列の数や、n個のノードからなる二分木の構成方法の数などを表します。
カタラン数は二項係数を用いて次のように定義できます。
C(n) = C(2n, n) / (n + 1)
つまり、Pythonでカタラン数を求めるには、まず二項係数 C(n, k) を計算する関数を用意し、その結果を (n + 1) で割ればよいことになります。
サンプルコード
def binomialCoefficient(n, k):
# C(n, k) の計算を最適化する
if (k > n - k):
k = n - k
coeff = 1
for i in range(k):
coeff *= (n - i)
coeff /= (i + 1)
return coeff
def catalan(n):
return binomialCoefficient(2*n, n) / (n + 1)
for i in range(11):
print(catalan(i))コードのポイント
- binomialCoefficient 関数では、k を n-k と比較して小さい方に置き換えることで、ループ回数を減らし計算を効率化しています。
- 乗算と除算を交互に行うことで、中間値が極端に大きくなるのを防いでいます。
- catalan 関数は、定義式「C(2n, n) / (n + 1)」をそのまま実装したものです。
実行結果
このコードを実行すると、0番目から10番目までのカタラン数が出力されます。
1.0 1.0 2.0 5.0 14.0 42.0 132.0 429.0 1430.0 4862.0 16796.0
補足:整数として出力したい場合
上記のコードでは除算により結果が浮動小数点数(float型)になります。整数として得たい場合は、catalan 関数内で int() に変換するか、Python 3.8以降で利用できる math.comb を使うと簡潔に書けます。
import math
def catalan(n):
return math.comb(2 * n, n) // (n + 1)
for i in range(11):
print(catalan(i))このように、二項係数の計算を組み合わせることで、カタラン数を簡単かつ効率的に求めることができます。
-
PythonのpylabでFigureをリモート環境に保存する方法
概要matplotlibのpyplotパッケージが提供するsavefig()メソッドを使えば、保存先のパスを指定するだけで、Figure(グラフ)をリモート環境に保存できます。GUIを持たないサーバーやクラウド環境でグラフを生成・保存したい場合に特に便利な手法です。手順別のバックエンドを使用するには、matplotlib.use(Agg)でバックエンドを明示的に設定します。plot()メソッドを使って線をプロットします。savefig()メソッドを使い、保存先のディレクトリ(パス)を指定するだけで、画像をリモート環境に保存できます。図を画面に表示したい場合は、plt.show()を使用します。
-
Pythonで文字列と数値を連結する方法をわかりやすく解説
Pythonで文字列と数値を連結する基本の方法Pythonでは、文字列と数値をそのまま + 演算子で結合することはできません。連結するには、str() 関数を使って数値を文字列型に変換する必要があります。以下は基本的な例です。>>> a = string >>> b = 1 >>> print(a + str(b)) string1このように str(b) によって数値 1 が文字列 1 に変換され、文字列同士として正しく連結されます。Python 2で使えたバッククォート記法についてPython 2では、数値をバッククォート(`)で囲むこ