scala--计算组合数

Posted scala算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala--计算组合数相关的知识,希望对你有一定的参考价值。

一般的排列组合计数公式


    在处理阶乘运算时,为了避免运算数值过大,可以采用两种方法优化: 连乘r个整商  和   利用二项式系数公式

  1. 方法一:连乘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--计算组合数的主要内容,如果未能解决你的问题,请参考以下文章

1586=计算组合数-java代码

课下作业1-利用计算机计算组合数

组合数计算

计算组合数

课程作业03:用递归方法计算组合数解决汉诺塔问题判断某个字符串是否回文

02课后作业