R: ошибка при попытке написать эквивалентную функцию n выберите k - PullRequest
0 голосов
/ 15 ноября 2018

Я беру класс введения для программирования 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'

Я понятия не имею, что еще можно сделать, чтобы это исправить.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Посмотрите на это {

a <- function(n, k) {
  exp(lgamma(n+1) - lgamma(n - k + 1) - lgamma(k + 1) )
}
0 голосов
/ 15 ноября 2018

Это не работает для больших 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

...