Pythonのreduce関数で有理数の積を求める方法を解説
有理数(分数)のリストが与えられたとき、reduce関数を使ってそれらの積を求める方法を解説します。reduce()関数は、2つの引数を受け取る関数をリストの各要素に対して左から右へ累積的に適用していく高階関数です。
例えば、入力が fractions = [(5,3),(2,8),(6,9),(5,12),(7,2)] の場合、出力は (175, 432) になります。これは次の計算によるものです。
5/3 × 2/8 × 6/9 × 5/12 × 7/2 = (5×2×6×5×7)/(3×8×9×12×2) = 2100/5184 = 175/432
解決の手順
- 空の新しいリスト fracs を用意する
- 元のリスト frac 内の各要素 f に対して、(分子, 分母) のペアから Fraction オブジェクトを生成し、fracs の末尾に追加する
- fracs に対して「func(x, y) が x*y を返す」関数で reduce を適用し、その結果を t とする
- t の分子(numerator)と分母(denominator)のペアを返す
実装例
実際のコードを見てみましょう。Python標準ライブラリの fractions.Fraction を使うことで、分数の約分も自動的に行われます。
from fractions import Fraction
from functools import reduce
def solve(frac):
fracs = []
for f in frac:
fracs.append(Fraction(*f))
t = reduce(lambda x, y: x*y, fracs)
return t.numerator, t.denominator
frac = [(5,3),(2,8),(6,9),(5,12),(7,2)]
print(solve(frac))入力
[(5,3),(2,8),(6,9),(5,12),(7,2)]
出力
(175, 432)
このように、reduce関数とlambda式を組み合わせることで、複数の分数の積を簡潔に計算できます。Fractionクラスが自動的に約分を行ってくれるため、結果は常に最も簡単な形の分数として得られるのがポイントです。
-
非再帰関数を使って2つの整数の最大公約数(GCD)を求めるCプログラム
問題与えられた2つの整数について、非再帰関数を用いて最大公約数(GCD:Greatest Common Divisor)を求めます。解決策最大公約数を求める最も一般的な方法は、ユークリッドの互除法です。これは「大きい方の数を小さい方の数で割った余り」と「小さい方の数」の最大公約数が、元の2つの数の最大公約数と等しくなるという性質を利用したものです。この性質を関数として実装することで、繰り返し処理によって効率よくGCDを計算できます。以下では、非再帰的なアプローチで2つの整数の最大公約数を求める手順を説明します。アルゴリズム非再帰関数を使って2つの整数の最大公約数(GCD)を求めるためのアルゴリ
-
【C言語】再帰関数を使って2つの整数の最大公約数(GCD)を求める方法
問題 C言語において再帰関数を使用し、与えられた2つの整数の最大公約数(GCD:Greatest Common Divisor)を求めます。 解決策 再帰関数を用いて2つの整数の最大公約数を求めるには、「ユークリッドの互除法」が利用できます。これは「2つの数のGCDは、大きい方の数を小さい方の数で割った余りと、小さい方の数とのGCDに等しい」という性質を応用した手法です。この計算を余りが0になるまで再帰的に繰り返すことで、GCDを効率よく求めることができます。 アルゴリズム 再帰関数を使って2つの整数のGCDを求めるためのアルゴリズムは、以下の手順に従います。 ステップ1 − 再帰関数を