我正在学习R编程入门课程。
我们被要求编写一个与n选择k相同的函数:
choose(n, k)
我们被要求通过运行n = 200,k = 50来检查该功能是否正常工作。
我编写了以下代码:
select_k <- function(n, k){
sr <- c(log10(log10((factorial(n-1)/factorial(k-1)*factorial(n-k-2)))*(n/k)))
return(sr)
}
因为select_k应该是“ n选择k”。
我的函数可以使用以下值:100选择25,但不适用于更大的值,例如n = 200,k = =50。
select_k( n = 200, k = 50)
[1] NaN
Warning message:
In factorial(n) : value out of range in 'gammafn'
我不知道还有什么可以解决的。
答案 0 :(得分:2)
这不适用于较大的n
,因为factorial(n)
太大:
> factorial(199)
[1] Inf
Warning message:
In factorial(199) : value out of range in 'gammafn'
这应该返回200,但是计算机只会看到您正在尝试将Inf
除以Inf
:
> factorial(200)/factorial(199)
[1] NaN
Warning messages:
1: In factorial(200) : value out of range in 'gammafn'
2: In factorial(199) : value out of range in 'gammafn'
显然,“ n select k”中的许多乘法都被抵消,因此您需要避免使用常规阶乘,而仅将未抵消的数字相乘(?prod
可能对您有用)。或者(可能更好)使用日志版本lfactorial
来避免遇到计算机无法存储的数字。
编辑:在@MrFlick的评论中添加了lfactorial
条推荐
答案 1 :(得分:1)
看看这个{
a <- function(n, k) {
exp(lgamma(n+1) - lgamma(n - k + 1) - lgamma(k + 1) )
}