对于班级作业,我需要创建一个计算 n 选择 k 的函数。我就是这么做的,对于较小的数字(例如 6 选择 2)它可以正常工作,但我应该让它在 200 选择 50 的情况下工作,但它自然不能。
答案太大,R 输出 NaN 或 Inf,表示:
> q5(200, 50)
[1] "NaN"
Warning message:
In factorial(n) : value out of range in 'gammafn'
我尝试使用对数和指数,但效果不佳。
q5 <- function (n, k) {
answer <- log(exp( factorial(n) / ( (factorial(k)) * (factorial(n - k)) )))
paste0(answer)
}
实际问题的答案是 R 无法显示它无法表示的数字,并且方程中的某些项太大而无法表示。所以它失败了。然而,可以使用阶乘的近似值 - 它们使用对数,而对数变大的速度要慢得多。
最著名的一个是斯特林近似,它不够准确,但是拉马努金近似 https://en.wikipedia.org/wiki/Factorial#Rate_of_growth_and_approximations_for_large_n来救援了:)
ramanujan <- function(n){
n*log(n) - n + log(n*(1 + 4*n*(1+2*n)))/6 + log(pi)/2
}
nchoosek <- function(n,k){
factorial(n)/(factorial(k)*factorial(n-k))
}
bignchoosek <- function(n,k){
exp(ramanujan(n) - ramanujan(k) - ramanujan(n-k))
}
nchoosek(20,5)
# [1] 15504
bignchoosek(20,5)
# [1] 15504.06
bignchoosek(200,50)
# [1] 4.538584e+47
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)