Python 3.x python函数简化分数
我正在尝试编写一个函数,它可以帮助我将一个分数分解成简单的组件,就像这样 我写了这个函数Python 3.x python函数简化分数,python-3.x,fractions,Python 3.x,Fractions,我正在尝试编写一个函数,它可以帮助我将一个分数分解成简单的组件,就像这样 我写了这个函数 from fractions import Fraction def lowest_fraction(frac): num = frac[0] den = frac[-1] if frac == (1, den): yield frac while frac != (1, den): new_num = num - num//2
from fractions import Fraction
def lowest_fraction(frac):
num = frac[0]
den = frac[-1]
if frac == (1, den):
yield frac
while frac != (1, den):
new_num = num - num//2
rem = num - new_num
new_frac = Fraction(new_num, den)
frac = (new_frac.numerator, new_frac.denominator)
num = rem
yield frac
我在下面跑了一遍
for each in [(1, 2), (3, 4), (3, 8), (5, 8), (7, 8), (7, 16), (9, 32)]:
print('{}: '.format(each))
for k in lowest_fraction(each):
print('\t{}'.format(k))
这是输出
(1, 2):
(1, 2)
(3, 4):
(1, 2)
(1, 4)
(3, 8):
(1, 4)
(1, 8)
(5, 8):
(3, 8)
(1, 8)
(7, 8):
(1, 2)
(1, 4)
(1, 8)
(7, 16):
(1, 4)
(1, 8)
(1, 16)
(9, 32):
(5, 32)
(1, 16)
(1, 32)
您可以看到
(3,8)
和(9,32)
的输出不是最简单的形式。我认为我想通过编写递归代码来实现,但我目前无法编写递归代码,因为我还没有完全理解递归的概念。递归只是意味着将函数应用于中间结果(在这种特殊情况下)。由于您使用的是迭代器而不是创建列表,在递归的情况下,您可能希望使用yield from
。此外,您还没有明确说明是否希望在一般情况下使用它,或者只适用于负整数的二次幂。@Mad物理学家,它应该适用于二次幂,因为我正在编写一些函数来解析音乐xml文件,所以持续时间几乎总是2次幂,就像这样。我知道(3,8)
是一个中间结果。如果frac[0]>1,我可以说,但我不知道如何准确地再次调用该函数。我试试看。你提到这两种力量后,我才想到。