scala--计算组合数
Posted scala算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala--计算组合数相关的知识,希望对你有一定的参考价值。
一般的排列组合计数公式
在处理阶乘运算时,为了避免运算数值过大,可以采用两种方法优化: 连乘r个整商 和 利用二项式系数公式
方法一:连乘r个
// 给定n个元素,从中拿取k个 来组成一个组合 (不考虑顺序), 计算出有多少种组合
// 用 连乘 r 个 整商的方法来优化阶乘运算 n-k+1 / k
def zuhe(n:Int,k:Int) = {
val k_new = if (k > n/2) n-k else k
var sum:Double = 1
for (i <- 1 to k_new) {
val fenzi = n - k_new + i
val fenmu = k_new - i + 1
println(fenzi / fenmu)
sum *= fenzi / fenmu.toDouble // 通过数学的方法可以证明,最后结果为整数,怎么证明的不知道
}
sum.toInt
}
zuhe(4,2)
zuhe(10,5)
zuhe(100,6)
2.使用二项式系数公式
// 当 n 和 k 都较大时, 会产生很大的值, 每次重新计算会比较消耗,
// 根据 二项式系数公式 c[i][j] = c[i-1][j] + c[i-1][j-1] 从i个里面拿出j个的组合 , 可以事先离线计算出一些 c[x][y] 的数值,后面根据输入的 i,j 直接用加法计算结果啦
// 以 100 以内为例:
// 生成 c(100)(100) 的数值,来存放 c[x][y]
def shengchengzuhe(n:Int,k:Int) = {
val arr = Array.ofDim[Int](n+1,k+1)
// 把 c[i][0]= 1 设为 1
arr.map(_(0)=1)
// 从 c[i][0]= 1 ; c[i][j]=0(i<j时) 按照公式 开始 往前递推计算
for(i <- 1 to n;j <- 1 to k){
arr(i)(j) = arr(i-1)(j) + arr(i-1)(j-1)
}
arr
}
val c = shengchengzuhe(100,100)
def getZuheNum(i:Int,j:Int) = {
val num = c(i-1)(j) + c(i-1)(j-1)
num
}
getZuheNum(100,6)
getZuheNum(20,5)
嗨,朋友,想学scala吗,这有个习题集,可以边自己编写代码解决问题边熟悉scala的语法哦!
以上是关于scala--计算组合数的主要内容,如果未能解决你的问题,请参考以下文章