首页 > 解决方案 > 如何在 R 中创建我自己的二项式系数函数

问题描述

我创建了一个阶乘函数,然后用于创建二项式系数的函数。我的阶乘函数有效,但二项式函数无效。

我需要创建一个阶乘函数,然后将其用于使用 R 创建一个二项式系数函数。我不允许使用基本程序的函数,例如阶乘,也不允许选择。我不得不使用 for 语句、逻辑等,即使它效率低下。

我必须打印零和十的阶乘,然后是 n = 5 和 k = 2 的二项式系数

fact <- function(n) {
  x <- 1 
  if(n == 0) {
    print(1)
  } else {
    for(i in 1:n) { 
      x <- x*i
    }
  }
  print(x)
}

fact(0)
fact(10)

bc <- function(n, k) {
  y <- fact(n) / fact(n - k) * fact(k)
  print(y)
}

bc(5, 2)

对于阶乘函数,我得到了正确答案

但是对于二项式函数,我很遥远。

如果有人能告诉我我在哪里犯了错误,我将不胜感激。

标签: r

解决方案


这里有很多问题,都与基本的 R 编码和一般的编码有关。让我们逐步了解其中的一些:

  1. 您的函数fact实际上不返回任何内容。目前它所做的只是print控制台的值。如果你看一下help("print")它说

    'print' 打印它的参数并不可见地返回它通过'invisible(x)')。

    所以为了fact真正返回一个值,我们可以做

    fact <- function(n) {
       x <- 1
       if (n > 0) {
           for (i in 1:n) x <- x * i
       }
       return(x)
    }
    

    n == 0我已通过删除不必要的检查来整理您的代码。

    请注意,仍有改进的余地。例如,有更好的方法来计算一个数字的阶乘。其次,您的函数目前无法正确处理负数。通常,阶乘只为非负整数定义。因此,您可以更改fact为返回NA负数,或者 - 也许更有趣 - 将阶乘函数推广到 Gamma 函数以允许任何实数(甚至复数)。不管怎样,我会把这个留给你。

  2. 同样,您的函数bc也不返回任何内容,而是将值写入y控制台。此外,您需要注意括号以确保术语(n - k)!k!在分母中。这两个问题都可以通过写作解决

    bc <- function(n,k) return(fact(n)/(fact(n - k) * fact(k)))
    
  3. 为了确认,我们计算 5 选择 2 的系数:

    bc(5, 2)
    #10
    

推荐阅读