首页 > 解决方案 > 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'

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

标签: rerror-handlingbinomial-coefficients

解决方案


这不适用于更大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来避免遇到您的计算机无法存储的数字。

编辑:lfactorial从@MrFlick 的评论中添加了推荐


推荐阅读