python整数阶乘组合运算_scala计算组合数

e14eef9283517258909a80cf1791b0e7.png

一般的排列组合计数公式

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

  1. 方法一:连乘r个 

    // 给定n个元素,从中拿取k个 来组成一个组合 (不考虑顺序), 计算出有多少种组合// 用 连乘 r 个 整商的方法来优化阶乘运算     n-k+1 / kdef 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    for(i         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的语法哦!

4d9474b4187285ce10dd4a91fc8a2a87.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值