-3

如何在 Python 中将分数转换为连分数?我试着环顾四周,发现有人使用 Fraction 模块来做与我的问题类似的事情,但我没有设法修改它们。我发现的图像示例:

例子

所以如果输入是181 101,那么输出应该是1 1 3 1 4 4。提前谢谢!

4

2 回答 2

3

好的,让我们从一些数学开始。这背后的理由很简单。对于分数 n/d,欧几里得除法是 n = d * q + r 其中 r < d

我们只需 n/d = (d * q + r) / d = q + r/d 且 r < d

现在我们用 1/(r/d) = d/r 迭代得到你的连分数

这将导致q的完成序列,因为分数序列的分母构成一个严格递减的整数序列,最多在d次操作中将达到0。

一个可能的 Python 实现可能是:

def cf(n, d):
    """Return the terms of the continued fraction when n is the numerator
and d the divisor as a list"""
    if d == 0: return []         # Ok it is finished
    q = n//d                     # compute the integer quotient
    r = n - q*d                  # the rest
    return [q] + cf(d, r)        # and recurse...

我们得到了预期:

>>> cf(181, 101)
[1, 1, 3, 1, 4, 4]
于 2018-01-04T13:00:43.660 回答
1

类似于 Serge 的回答,我们可以编写一个迭代版本(Python3):

def cf(n, d):
    res = []
    q, r = divmod(n, d)
    while r != 0:
        res = res + [q]
        prev_r = r
        q, r = divmod(d, r)
        d = prev_r
    return res + [q]
于 2019-11-17T17:02:39.830 回答