Python 奇行为贪婪算法

Python 奇行为贪婪算法,python,algorithm,greedy,Python,Algorithm,Greedy,我已经实现了贪婪算法来求解埃及分数,但是我得到了一些意想不到的结果。这是我的密码 from math import ceil from fractions import Fraction def go(frac): ret = [] while frac > 0: if frac.numerator == 1: ret.append(frac) break x = Fraction(1, ce

我已经实现了贪婪算法来求解埃及分数,但是我得到了一些意想不到的结果。这是我的密码

from math import ceil
from fractions import Fraction

def go(frac):
    ret = []
    while frac > 0:
        if frac.numerator == 1:
            ret.append(frac)
            break
        x = Fraction(1, ceil(frac.denominator / frac.numerator))
        frac -= x
        ret.append(x)
    return ret

input1 = int(raw_input('numerator: '))
input2 = int(raw_input('denominator: '))

print go(Fraction(input1, input2))
我经常遇到错误“TypeError:两个参数都应该是有理实例”

我一直在记录,它在while循环的第一次迭代中崩溃了

编辑:详细错误为:

File "egypt.py", line 19, in <module>
print go(Fraction(input1, input2))
File "egypt.py", line 10, in go
x = Fraction(1,ceil(frac.denominator / frac.numerator))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/fractions.py", line 158, in __new__
raise TypeError("both arguments should be "
TypeError: both arguments should be Rational instances
文件“埃及.py”,第19行,在
打印go(分数(输入1,输入2))
文件“egypt.py”,第10行,在go中
x=分数(1,ceil(分数分母/分数分子))
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/fractions.py”,第158行,新__
raise TypeError(“两个参数都应为”
TypeError:两个参数都应该是Rational实例
为什么会这样? 谢谢。

尝试更改此选项:

x = Fraction(1, ceil(frac.denominator / frac.numerator))
为此:

x = Fraction(1,int(ceil(frac.denominator / float(frac.numerator))))

您的代码中有两个问题

  • 你用
    int
    除以
    int
    ,它总是返回一个
    int
    ;在你的例子中,你把
    a/b
    除以
    a
    ,所以它总是四舍五入到0
  • 然后,您将
    ceil()
    返回一个
    float
    (0.0),这是
    分数
    不喜欢的;它需要
    int
    s
  • 因此,请尝试以下方法:

    Fraction(1, int(ceil(float(frac.denominator) / frac.numerator)))
    

    代码的其余部分看起来不错。

    首先,
    frac.分母
    frac.分子
    都是整数,所以除法是整数除法,它向下舍入,可以得到0个值,所以你需要转换成一个浮点数来获得正确的除法。其次,
    ceil
    返回一个浮点数,所以你需要转换成一个整数,因为
    分数
    需要两个整数。非常好的解释。谢谢。