总体说明:本文的优化思路并不局限于Python,但C、C++、C#、Java等语言无法使用内置类型直接表示大整数,需要通过数组等特定形式并自己实现大整数乘除法才能实现,因此本文只介绍Python语言的实现。

按照标准的组合数公式,再结合Python标准库的阶乘函数factorial(),很容易写出下面的代码:

def cni(n, i):
    from math import factorial
    return factorial(n) // factorial(i) // factorial(n-i)

但是,在上面代码的执行过程中,很多计算是重复的,于是我在《Python可以这样学》和《Python程序设计开发宝典》中给出了下面的优化思路和代码,大幅度减少了重复的计算,提高了计算效率。主要思路是对组合数计算公式的分子分母进行展开,并约去重复计算。

def cni1(n,i):
    result=1
    Min,Max=sorted((i, n-i))
    for i in range(n,0,-1):
        if i> Max:
            result *=i
        elif i <= Min:
            result =result // i
    return result

非常感谢浙江温州永嘉县教师发展中心应根球老师又对这个算法进行了进一步优化,提供了下面的两段等价代码,通过自然数分布的对称性和一乘一除的结合,有效避免了中间结果过大而导致效率降低的问题。

def cni2(n,i):
    result = 1
    for j in range(0, i):
        result = result * (n-j) // (j+1)
    return result

def cni3(n,i):
    result = 1
    for j in range(1, i+1):
        result = result * (n-i+j) // j
    return result

下面是测试代码,大家可以修改参数进行更多测试,也欢迎提供更好的优化思路和代码。

n = 100000
i = 52019
print(cni1(n,i))
print(cni(n,i) == cni1(n,i)==cni2(n,i)==cni3(n,i))

----------喜大普奔----------

1、继《Python程序设计基础》《Python程序设计(第2版)》《Python可以这样学》系列图书之后,董付国老师新书《Python程序设计开发宝典》已于2017年8月1日在清华大学出版社出版。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:

https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3

2、10月13日——15日,重庆,全国高校程序设计系列课程高级研究班,详见:全国高校程序设计系列课程高级研修班(Python)通知

Python版组合数计算方法优化思路和源码相关推荐

  1. Zxing生成二维码思路和源码解析

    Zxing生成二维码思路和源码解析 本博文是一篇介绍google zxing包生成二维码的思路和它的源码的文章. 一.引入 如何调用zxing的代码生成一个二维码呢?主要的函数只有一个,如下所示: B ...

  2. 从 json 文件到炫酷动画 - Lottie 实现思路和源码分析

    Lottie是最近Airbnb开源的动画项目,支持Android.iOS.ReactNaitve三个平台,相关背景介绍可以参考之前的文章Airbnb开源炫酷动画库Lottie(译)-看看Airbnb的 ...

  3. android lottie字体json,从json文件到炫酷动画-Lottie实现思路和源码分析

    从json文件到炫酷动画-Lottie实现思路和源码分析,Lottie是最近Airbnb开源的动画项目,支持Android.iOS.ReactNaitve三个平台,本文分析主要Lottie把json文 ...

  4. 购物车及商品php代码_php实现商城购物车的思路和源码分析

    本文介绍一个php实现的购物车代码,功能实现完整,具有一定的参考价值 这里我们为你提供个简单的php购物车代码,从增加购物产品与发生购买了,在商城开发中,这个功能是少不了的 具体分析如下: 对购物车里 ...

  5. 下载java免安装包_下载并获取免安装版的JDK、JRE和源码包

    首先,我们需要去Oracle官网下载JDK的exe安装程序,下载页面:传送门,我下载的是截至目前为止最新的JDK 8u192.接下来就有两种方式获取免安装版的JDK.JRE和源码包,第一种方式不需要打 ...

  6. Java 版植物大战僵尸思路和源码分享!

    点击上方"逆锋起笔",公众号回复 PDF 领取大佬们推荐的学习资料 来源 | https://urlify.cn/byeEjy 有谁没玩过植物大战僵尸吗?用Java语言开发了自己的 ...

  7. php mysql购物车实现原理_PHP实现购物车的思路和源码分析

    这里主要是记录下自己的购物车的思路,具体功能实现,但是尚未在实际项目中用到,不对之处欢迎指正 项目中需要添加购物车. 目录说明 buy.php 点击购买之后的操作 car.php 购物车,显示购买的东 ...

  8. linux实现cp拷贝命令的思路和源码

    1.思路: 命令参数样式: cp src.c des.c argv[0] argv[1] argv[2] (1).C语言参数. int argc(参数个数). char** argv (2)编程思路: ...

  9. python版 常用排序算法 思路加详解 冒泡排序、快速排序、插入排序、选择排序

    注:这里所有排序操作都以从小到大排列为例,想要从大到小排的自行修改代码即可 目录 一.冒泡排序 思路: 步骤: 解析: 二.快速排序 思路: 步骤: 代码: 三.插入排序 思路: 代码: 四.选择排序 ...

最新文章

  1. Javascript 判断网页横竖屏
  2. c语言malloc面试题,c语言面试最必考的十道试题,求职必看!!!
  3. Amoeba实现读写分离
  4. Java 需要转义的字符以及json字符串的转义
  5. 吴恩达《深度学习》第二门课(3)超参数调试、Batch正则化和程序框架
  6. jsp+servlet+mysql的简单使用
  7. tomcat 加载js 中文乱码
  8. 根据视频链接并下载视频(mp4格式)
  9. 手机屏幕什么计算机,手机屏幕和电脑屏幕的区别
  10. django+echarts数据可视化(NBA球队数据可视化02)!
  11. 快速实现win11恢复win10系统 分享无损恢复win10系统
  12. 米家扫地机器人尘盒怎么取_米家扫地机器人1S:从里到外全面提升 拥有超高性价比...
  13. Eclipse 查看类继承和实现关系(包括子类)
  14. Faker最新仓库地址更新 4/6
  15. 电脑搜索文件的服务器,Archivarius注册版
  16. 蝙蝠侠最新截图----光影的典型例证
  17. Go36-36,37-字符串
  18. 电商平台模板设计(思维导图)
  19. Xcode Instruments之概述
  20. 南京信息工程大学python期末考试_考研想考南京信息工程大学怎么样?

热门文章

  1. python for android 安装配置_mac appium for android 环境搭建 (appium python pycharm)
  2. vscode中文支持xp_VSCode (Visual Studio Code) V1.43.0下载并设置成中文语言的方法
  3. linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一
  4. Spring3集成Swagger2遇到问题总结
  5. 注解形式控制器配置(5) 数据绑定2
  6. retrofit框架学习(一)----基本用法
  7. ObservableScrollView实现
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的校园二手自行车交易系统
  9. python入门基本笔记_Python入门基础知识笔记
  10. 【总结】 Lucas定理