【R语言】1,2,3,4四个数字可以组合成多少个不同的且不能重复的三位数(CH02作业复习)

题目为“1,2,3,4四个数字可以组合成多少个不同的且不能重复的三位数”
我最初的想法是可以直接用choose函数计算组合。
也就是直接用如下这一行代码即可

choose(4,3)

计算结果是4,而不是正确的24。犯了该错误的原因在于我对choose函数的使用以及排列组合不太了解。
首先,关于choose函数,在R自带的help文档中,对choose函数的使用介绍如下

Note that choose(n, k) is defined for all real numbers n and integer k. For k ≥ 1 it is defined as n(n-1)…(n-k+1) / k!, as 1 for k = 0 and as 0 for negative k. Non-integer values of k are rounded to an integer, with a warning.
choose(*, k) uses direct arithmetic (instead of [l]gamma calls) for small k, for speed and accuracy reasons. Note the function combn (package utils) for enumeration of all possible combinations.

需要注意的是,choose(n,k)函数需要由实属n和整形k所定义。对于任意一个k大于等于1的情况,这个函数将被定义为n(n-1)…(n-k+1) / k! C n k 我们可以发现,其实这就是二项式分布里的C_n^k
为什么直接用这个公式不可以呢?因为在题目的条件下,应该要考虑排列的顺序,123,132,231,213应当记作四次,但是在choose函数中只会被记作一次。
也就是说,其实这里要用的公式应该是二项式分布里的 A n k A_n^k 应该用排列的公式计算。所以正确答案应该是

choose(4,3)*factorial(3)

要再乘上3个因素。这里的factorial函数又起到了怎样的作用呢?

factorial(x) (x! for non-negative integer x)

做非负整数x的阶乘。所以再乘上factorial(3)就没错了,乘上3!从算组合的公式变成算排列的公式。
上述是只算“1,2,3,4四个数字可以组合成多少个不同的且不能重复的三位数”个数的方法,如果要展示每种组合的情况,该如何计算?

n = 0 
for(i in c(1,2,3,4)){
  for(j in c(1,2,3,4)){
    for(k in c(1,2,3,4)){
      if(i != j && j!= k &&i!=k){
        num = paste(i,j,k,sep = " ")#paste是连接字符串的命令,sep是连接的分隔符
        print(num)#显示可有的组合
        n = n+1
      }
    }
  }
}
n

我这里选择了三次循环嵌套的方法计算,num用来显示各种情况,n用来计数。从1到4依次选择组合,并排除数字重复的情况。这里的paste函数是连接字符串的命令,sep是连接的分隔符。
 
 
以上是我对问题“1,2,3,4四个数字可以组合成多少个不同的且不能重复的三位数”的解答,在解决这个问题的过程中我的老师给了我很多帮助,文末感谢老师。
如果本文表述有误,或有更好的方法,欢迎批评指正。

发布了14 篇原创文章 · 获赞 24 · 访问量 1628

猜你喜欢

转载自blog.csdn.net/weixin_46124302/article/details/104656209