C#,卡特兰数(Catalan number,明安图数)的算法源代码

一、概要

卡特兰数(英语:Catalan number),又称卡塔兰数、明安图数,是组合数学中一种常出现于各种计数问题中的数列。以比利时的数学家欧仁·查理·卡特兰的名字来命名。1730年左右被蒙古族数学家明安图使用于对三角函数幂级数的推导而首次发现,1774年被发表在《割圜密率捷法》。

二、卡特兰数的历史


1730年,中国清代蒙古族数学家明安图比卡特兰更早使用了卡特兰数,在发现三角函数幂级数的过程中,见《割圜密率捷法》。后来他的学生在1774年将其完成发表。
1753年,欧拉在解决凸包划分成三角形问题的时候,推出了卡特兰数。
1758年,Johann Segner 给出了欧拉问题的递推关系。
1838年,拉梅给出完整证明和简洁表达式;欧仁·查理·卡特兰在研究汉诺塔时探讨了相关问题,解决了括号表达式的问题。
1900年,Eugen Netto 在著作中将该数归功于卡特兰。
内蒙古师范大学教授罗见今1988年以及1999年的文献研究表明实际上最初发现卡特兰数的也不是欧拉,而是明安图。
最后,由比利时的数学家欧仁·查理·卡特兰命名。在中国却应当由清代蒙古族数学家明安图命名。

三、应用

1、数字序列的括号化(n对括号正确匹配数目)
2、凸多边形三角划分
3、给定节点组成二叉搜索树
 

四、源代码与改进代码

1、原始代码

/// <summary>
/// 计算第 n 个卡塔兰数
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static ulong CatalanOriginal(int n)
{ulong res = 0;if (n <= 1){return 1;}for (int i = 0; i < n; i++){res += CatalanOriginal(i) * CatalanOriginal(n - i - 1);}return res;
}

2、计算结果(前64个卡塔兰数)

1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, 18367353072152, 69533550916004, 263747951750360, 1002242216651368, 3814986502092304, 14544636039226909, 55534064877048198, 212336130412243110, 812944042149730764, 3116285494907301262, 11959798385860453492, 9057316177202639132, 10713166123620736856, 16342585076431942214, 2689383809735779348, 5102839245063848452, 11119451935032739784, 14452914362348096668, 14071982300670990120, 11142706294756623192, 3114992555900662896, 16682282172542456626, 11604953028367754716, 10347338891492931260, 6533841209031609592, 17577068357745673116, 11934029089710590568, 3367710287996676216, 1700012784093890096, 9253156062895436676, 11766576147974922296, 7683395182710107672, 16195324623391601584, 15200231439582411976, 13944974943675103408, 15751729141727956688, 14950683510242200608, 7096100506878905693,

:P

如果你直接用上面的代码计算,计算机一定卡死啦!

下面的代码,秒出!

3、程序员写的,不是码农写的代码

/// <summary>
/// 存储所有n之前的卡塔兰数
/// </summary>
private static List<ulong> catalanList = new List<ulong>();/// <summary>
/// 计算 n 个卡塔兰数的改进算法
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static ulong Catalan(int n)
{catalanList.Clear();for (int k = 0; k <= n; k++){ulong res = 0;if (k <= 1){catalanList.Add(1);}else{for (int i = 0; i < k; i++){res += catalanList[i] * catalanList[k - i - 1];}catalanList.Add(res);}}return catalanList[n];
}

永远记住所谓的程序优化,只有一个原则,就是:用存储换计算!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git不走弯路】(一)版本管理需求分析

1. 什么是版本 在计算机中&#xff0c;版本就是备份。备份是计算机中的“后悔药”&#xff0c;可以在任何需要的时候将数据从以前的备份中原样取出。备份和快照、还原点是相似的东西。计算机词汇每年都层出不穷&#xff0c;很多词汇背后的原理却简单朴素。 2. 版本管理的必要…

运动模型非线性扩展卡尔曼跟踪融合滤波算法(Matlab仿真)

卡尔曼滤波的原理和理论在CSDN已有很多文章&#xff0c;这里不再赘述&#xff0c;仅分享个人的理解和Matlab仿真代码。 1 单目标跟踪 匀速转弯&#xff08;CTRV&#xff09;运动模型下&#xff0c;摄像头输出目标状态camera_state [x, y, theta, v]&#xff0c;雷达输出目标状…

【软件测试】学习笔记-代码级测试的基本理念与方法

通常情况下&#xff0c;代码级测试的工作都是由开发人员完成&#xff0c;但是测试框架选型、覆盖率统计工具选型、测试用例设计原则等都需要资深的测试工程师或者测试架构师参与。 为了能更好地协助开发人员做好代码级测试&#xff0c;这篇文章是根据实际工程项目中的实践&…

js逆向第19例:猿人学第17题天杀的Http2.0

文章目录 一、前言二、定位关键参数三、代码实现四、参考文献一、前言 任务十七:抓取这5页的数字,计算加和并提交结果 题目已经给出来标准答案,而且此题设置为“非常简单”其关键就是HTTP/2.0请求,打开控制台查看请求接口数据如下: 二、定位关键参数 可以看到控制台显示…

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…

MES系统如何进行产品的质量管理

质量管理重点是对产品的检验&#xff0c;这里面包括&#xff1a;采购来料检验、工序检验、入库前检验等几个检验环节&#xff0c;并根据系统设定的检验标准进行检验&#xff0c;检验不通过的不能留到下个环节。质量管理也是万界星空科技云MES中的一个重要组成部分&#xff0c;旨…

Java接入Apache Spark(入门环境搭建、常见问题)

Java接入Apache Spark&#xff08;环境搭建、常见问题&#xff09; 背景介绍 Apache Spark 是一个快速的&#xff0c;通用的集群计算系统。它对 Java&#xff0c;Scala&#xff0c;Python 和 R 提供了的高层 API&#xff0c;并有一个经优化的支持通用执行图计算的引擎。它还支…

vue3 源码解析(3)— computed 计算属性的实现

前言 本文是 vue3 源码分析系列的第三篇文章&#xff0c;主要介绍 vue3 computed 原理。computed 是 vue3 的一个特性&#xff0c;可以根据其他响应式数据创建响应式的计算属性。计算属性的值会根据依赖的数据变化而自动更新&#xff0c;而且具有缓存机制&#xff0c;提高了性…

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 目录 Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 一、简单介绍 二、实现原理 三、注意实现 四、实现步骤 五、关键脚本 一、简单介绍 Unity 工具类&#xff0c;自己整理的一些游戏开发可能用到的模块&#x…

TIDB的忘了root用户密码和数据库密码解决办法

方法一&#xff1a; 1、修改配置文件重启tidb&#xff0c;无密码登录修改root密码 找到配置文件 tidb.toml &#xff0c;在[security] 作用域下增加如下配置&#xff1a; [security] skip-grant-tabletrue 重启tidb&#xff1a; sh run_tidb.sh 2、重启后&#xff0c;就可以无密…

Vue:将以往的JQ页面,重构成Vue组件页面的大致思路梳理(组件化编码大致流程)

一、实现静态组件 组件要按照功能点拆分&#xff0c;命名不要与HTML元素冲突。 1、根据UI提供的原型图&#xff0c;进行结构拆分&#xff0c;拆分的粒度以是否方便给组件起名字为依据。并梳理好对应组件的层级依赖关系。 2、拆分好结构后&#xff0c;开始对应的写组件&#x…

怎么节约cdn流量- 速盾网络(Sudun)

节约CDN流量的有效方法&#xff1a;速盾网络&#xff08;Sudun&#xff09;的实用建议 在当今数字化时代&#xff0c;网站和应用程序依赖于CDN&#xff08;内容分发网络&#xff09;来加速内容传输&#xff0c;提高用户体验。然而&#xff0c;有效地管理CDN流量对于优化成本和…

vue3-响应式基础之reactive

reactive() 还有另一种声明响应式状态的方式&#xff0c;即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同&#xff0c;reactive() 将使对象本身具有响应性&#xff1a; 「点击按钮1」 <script lang"ts" setup> import { reactive } from vuec…

ATECLOUD-POWER测试系统如何检测电源稳定性?

电源模块做为一种电源供应器为电子设备提供供电&#xff0c;广泛应用于汽车电子、航空航天、医疗、通信等各个领域&#xff0c;因此检测电源模块的稳定性是非常重要的&#xff0c;确保其为电子设备提供稳定的电压和电流&#xff0c;保证电子设备可以正常稳定工作。 电源模块的稳…

四川古力未来科技有限公司:抖音小店的崛起之路

随着互联网的飞速发展&#xff0c;电子商务已经成为人们日常生活中不可或缺的一部分。作为一家以科技为核心的公司&#xff0c;四川古力未来科技有限公司在电子商务领域中崭露头角&#xff0c;特别是其抖音小店的发展引人注目。 四川古力未来科技有限公司的抖音小店自开业以来&…

【docker】Docker Stack 详细使用及注意事项

一、什么是 Docker Stack Docker Stack 是 Docker Swarm 环境中用于管理一组相关服务的工具。它使得在 Swarm 集群中部署、管理和扩展一组相互关联的服务变得简单。主要用于定义和编排容器化应用的多个服务。以下是 Docker Stack 的一些关键特点&#xff1a; 服务集合&#xf…

RT-Thread:STM32 PHY 调试,使用软件包 WIZNET 驱动 W5500

说明&#xff1a; 1. 本文记录使用 RT-Thread 软件包 WIZNET驱动 W5500 的调试笔记。 2. 采用 RT-Thread Studio 工程 STM32F407VET6 芯片&#xff0c;W5500 PHY芯片&#xff0c;两者之间使用SPI接口链接 。 注意&#xff1a; 1.在按流程建立工程&#xff0c;和移植完 wizn…

SQL语句详解三-DML(数据操作语言)

文章目录 DML添加数据删除数据修改数据 DML DML(数据操作语言)&#xff1a;增删改表中数据&#xff0c;针对的对象是数据库中表格的数据。 添加数据 语法 -- 方式一 insert into 表名(列名1 , 列名2 , ... , 列名n) values(值1 , 值2 , ... , 值n); -- 方式二 insert into 表…

LeetCode---121双周赛---数位dp

题目列表 2996. 大于等于顺序前缀和的最小缺失整数 2997. 使数组异或和等于 K 的最少操作次数 2998. 使 X 和 Y 相等的最少操作次数 2999. 统计强大整数的数目 一、大于等于顺序前缀和的最小缺失整数 简单的模拟题&#xff0c;只要按照题目的要求去写代码即可&#xff0c;…

2-Linux-应用-部署icwp-Linux虚拟机【Django+Vue+Nginx+uwsgi+Linux】

本文概述 本文章讲述基于Linux CentOS 7系统&#xff08;虚拟机&#xff09;&#xff0c;部署DjangoVue开发的前后端分离项目。 项目源码不开放&#xff0c;但是操作步骤可以借鉴。 该文章将项目部署在Linux虚拟机上&#xff0c;暂不使用Docker 相关指令尽量展示执行路径&am…