Categories: Python

【Python】階乗を計算・取得する方法

この記事では、Pyhtonで階乗を計算・取得する方法を解説します。

階乗とは「ある正の整数から1までの積のこと」です。
主に順列などの組合せ論に使用されます。

順列・組み合わせ・重複組み合わせ・デカルト積を取得する方法

それでは、Pythonで階乗を計算する方法を見ていきましょう!

階乗とは?

階乗とは、「ある正の整数から1までの積」のことです。

4の階乗と言われたら 4 * 3 * 2 * 1 となり、答えは 24 です。

また、階乗は!で表現されます。4の階乗は以下の通りです。

4! = 4 * 3 * 2 * 1 = 24

ちなみに、Pythonで4!と記述してもSyntaxErrorになるので注意してください。

階乗を取得する

階乗を取得するにはmathモジュールのfactorial()関数を使うのが一番です。

import math

math.factorial(x)

factorial()関数は、x引数の階乗を整数で返します。

import math

print(math.factorial(4))

実行結果

24

整数以外や負の値を指定するとValueErrorが送出されます。

また、Python 3.9からfloat型の整数値(1.0や10.0など)も非推奨となったので注意が必要です。Python 3.9ではエラーにはならないが、以下のような警告が出力される。

import math

print(math.factorial(4.0))

実行結果

/Users/user/Desktop/Python/test.py:3: DeprecationWarning: Using factorial() with floats is deprecated
  print(math.factorial(4.0))
24

Python 3.10では、TypeError: 'float' object cannot be interpreted as an integerとなる。

階乗を計算するプログラム

それでは、階乗を計算するプログラムを実装してみましょう。

階乗を実装する上でのポイント
  • 渡された整数から1までの積
  • 0が渡された場合は1を返す

ループを使った階乗

for文やwhile文などの反復処理を使うことで階乗を求めることができます。

以下の関数では、引数の値が整数型でない、または負の値だった場合はValueErrorを送出させ、0と1の時は1を返し、それ以外の場合はwhile文を使って階乗を計算して返しています。

def factorial(x):
    # 非整数型、または負の値の場合はValueError
    if not isinstance(x, int) or x  1:
            r *= x
            x -= 1
        return r

print(factorial(4))

実行結果

24

再帰関数を使った階乗

再帰関数とは、関数内で自身の関数を呼び出す関数のことを言います。再帰関数を使うことでも階乗を求めることができます。

def factorial(x):
    return 1 if (x==0 or x==1) else x * factorial(x - 1)


print(factorial(4))

実行結果

24

上記コードでは、三項演算子を使って渡された値が0と1の時に1を返し、それ以外の場合はx * factorial(x - 1)を返します。

この関数の問題点として再帰関数は再帰できる回数が決められているので大きい値を指定されるとRecursionErrorが発生します。

まとめ

この記事では、Pythonで階乗を計算・取得する方法を解説しました。

学習のために色々な計算方法を見ていきましたが、基本的には用意されている関数の方が早いので、ただ単に階乗を取得する場合にはmath.factorial()関数を使いましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago