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
,所以它总是四舍五入到0ceil()
返回一个float
(0.0),这是分数
不喜欢的;它需要int
sFraction(1, int(ceil(float(frac.denominator) / frac.numerator)))
代码的其余部分看起来不错。首先,
frac.分母
和frac.分子
都是整数,所以除法是整数除法,它向下舍入,可以得到0个值,所以你需要转换成一个浮点数来获得正确的除法。其次,ceil
返回一个浮点数,所以你需要转换成一个整数,因为分数
需要两个整数。非常好的解释。谢谢。