【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 Cnk
为什么直接用这个公式不可以呢?因为在题目的条件下,应该要考虑排列的顺序,123,132,231,213应当记作四次,但是在choose函数中只会被记作一次。
也就是说,其实这里要用的公式应该是二项式分布里的 A n k A_n^k Ank应该用排列的公式计算。所以正确答案应该是

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四个数字可以组合成多少个不同的且不能重复的三位数”的解答,在解决这个问题的过程中我的老师给了我很多帮助,文末感谢老师。
如果本文表述有误,或有更好的方法,欢迎批评指正。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值