R:试图写入等效函数时出错n选择k



我正在上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'

我不知道还能做些什么来解决这个问题。

这不适用于较大的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选择k"中的很多乘法都会抵消,所以你需要避免使用正则阶乘,只乘以没有抵消的数字(?prod可能对你有用(。或者(可能更好(使用日志版本lfactorial,以避免遇到计算机无法存储的数字。

编辑:从@MrFlick的评论中添加了lfactorial建议

看看这个{

a <- function(n, k) {
  exp(lgamma(n+1) - lgamma(n - k + 1) - lgamma(k + 1) )
}

最新更新