最近在写R语言期末报告的时候遇到一道写组合数函数的题目,还是挺有意思的,就跟大家分享一下,希望能对你有帮助~
内容为两大部分,分别是
阶乘
组合数
接下来看看题目要求
在脑海里第一反应就是,先温习一下阶乘,是的,先把阶乘函数定义出来,组合数就很简单了。
阶乘
阶乘函数有很多种实现的办法,这里使用递归的方法实现
函数就一个参数n,当n等于0或者等于1时,结果为1,当n小于0时,我们定义函数会报错。
#定义阶乘函数,输入负数或者浮点数都会报错
JieC = function(n)
{ result = 0
if(n < 0 | n %% 1 != 0)
{print("Data Error!")
return ()}
else if(n == 0 | n == 1)
{result = 1}
else {result = JieC(n - 1) * n}
return (result)
}
至于这里为什么会有return ()
是因为我不希望出现下面的情况
测试一下这个函数
#测试
JieC(5)
输出:
JieC(5)
[1] 120
#测试
JieC(10.2)
输出:
JieC(10.2)
[1] “Data Error!”
NULL
#测试
JieC(-5)
输出:
JieC(-5)
[1] “Data Error!”
NULL
没有问题,接下来定义组合数的函数就很简单的事了。
组合数
我们还是希望我们的程序更加的健壮,考虑n,k都不能小于0,k必须小于等于n,n,k都不能带小数点。
#定义计算组合数函数
CNK = function(n,k)
{ result = 0
if(n < 0 | k < 0 | n %% 1 != 0 | k %% 1 != 0 | k > n)
{print("ERROR")}
else
{ result = (JieC(n)) / (JieC(k) * JieC(n - k))
return (result)
}
}
测试一下函数
#测试
CNK(-10,7)
CNK(10,-7)
CNK(10,1.7)
CNK(1.9,7)
CNK(10,11)
CNK(10,7)
CNK(10,10)
输出:
#测试
CNK(-10,7)
[1] “ERROR”
CNK(10,-7)
[1] “ERROR”
CNK(10,1.7)
[1] “ERROR”
CNK(1.9,7)
[1] “ERROR”
CNK(10,11)
[1] “ERROR”
CNK(10,7)
[1] 120
CNK(10,10)
[1] 1
大功告成!!