[问题] 看似等价但出错的code求解

楼主: znmkhxrw (QQ)   2018-04-14 16:16:32
# fact(n):= n! = n*(n-1)*...*2*1
def fact(n):
total = 1
while n >= 1:
total *= n
n -= 1
return total
#comb(n,m):= C(n,m) = fact(n)/(fact(m)*fact(n-m))
def comb(n,m):
return fact(n)/(fact(m)*fact(n-m))
#simply define a function f as f(n):= comb(n,n/2)/2**n for even n
def f(n):
return comb(n,n/2) / 2**n
print( f(200) ) # OverflowError: int too large to convert to float
print( comb(200,100) / 2**200 ) # 0.05634..., it works!
作者: AlaRduTP (Eden)   2018-04-14 17:07:00
把 f 的 n / 2 改成整数除法 n // 2 试试看。如果还是不知道差别,就把 type(200 / 2) 印出来看看吧!
楼主: znmkhxrw (QQ)   2018-04-14 18:06:00
知道了!! 谢谢
作者: Zundel (编圆人)   2018-04-15 10:41:00
个人认为是 function 的底层会自动帮你加上 float()(避免一边 float 一边 int 无法运算),而你直接除的时候因为两边都是整数所以不用加上 float
楼主: znmkhxrw (QQ)   2018-04-15 17:29:00
我去检查时确实是 fact(200)*fact(100.0)出错若是fact(200)*fact(100)就不会
作者: FakeGPS (一次就上手)   2018-04-16 08:20:00
何不试试 math.factorial(x)

Links booklink

Contact Us: admin [ a t ] ucptt.com