Python
 Computer >> コンピューター >  >> プログラミング >> Python

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))

このように、二項係数の計算を組み合わせることで、カタラン数を簡単かつ効率的に求めることができます。

  1. PythonのpylabでFigureをリモート環境に保存する方法

    概要matplotlibのpyplotパッケージが提供するsavefig()メソッドを使えば、保存先のパスを指定するだけで、Figure(グラフ)をリモート環境に保存できます。GUIを持たないサーバーやクラウド環境でグラフを生成・保存したい場合に特に便利な手法です。手順別のバックエンドを使用するには、matplotlib.use(Agg)でバックエンドを明示的に設定します。plot()メソッドを使って線をプロットします。savefig()メソッドを使い、保存先のディレクトリ(パス)を指定するだけで、画像をリモート環境に保存できます。図を画面に表示したい場合は、plt.show()を使用します。

  2. Pythonで文字列と数値を連結する方法をわかりやすく解説

    Pythonで文字列と数値を連結する基本の方法Pythonでは、文字列と数値をそのまま + 演算子で結合することはできません。連結するには、str() 関数を使って数値を文字列型に変換する必要があります。以下は基本的な例です。>>> a = string >>> b = 1 >>> print(a + str(b)) string1このように str(b) によって数値 1 が文字列 1 に変換され、文字列同士として正しく連結されます。Python 2で使えたバッククォート記法についてPython 2では、数値をバッククォート(`)で囲むこ