Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x python函数简化分数_Python 3.x_Fractions - Fatal编程技术网

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,我可以说
,但我不知道如何准确地再次调用该函数。我试试看。你提到这两种力量后,我才想到。