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

news2024/11/18 8:21:18

一、概要

卡特兰数(英语: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.coloradmin.cn/o/1378784.html

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

相关文章

基于matlab实现AUTOSAR软件开发---答疑5

最近还是经常有人反馈mode switch的枚举搞不定,我在统一回复下,希望可以解决大家的疑问 运行这个脚本即可,运行成功后,就已经存在于SIMULINK系统里了,程序中可以直接识别到的, 但是运行之后 在matlab基础工作区里也是看不到枚举的,这点大家要注意,不要纠结这个,实际…

神经网络|张量tensor(待完善)

文章目录 tensor/张量什么是tensor&#xff1f;如何用代码实现tensortensor在神经网络中的应用 其他 tensor/张量 什么是tensor&#xff1f; 张量是用来探究一个点在各个切面&#xff08;一共三个切面&#xff09;和各个方向&#xff08;x&#xff0c;y&#xff0c;z三个方向&…

微服务接口工具Swagger2

##1、什么是Swagger? # 官网 https://swagger.io/核心功能 生成接口说明文档生成接口测试工具 2、SpringBoot集成Swagger2 1&#xff09;、添加依赖 <!-- swagger2 --><!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --><depen…

【qt】sdk写pro写法,cv,onnx,cudnn

我的sdk在OpenCV003项目里&#xff1a; pro中添加 CONFIG(release, debug|release) {LIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lonnxruntimeLIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lonnxruntime_providers_cudaLIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lon…

NowinAndroid—2024 Android现代开发全功能应用

NowinAndroid—2024 Android现代开发全功能应用 现代Android开发全功能示例应用Now-in-Android&#xff0c;它是用Kotlin和Jetpack Compose开发的&#xff0c;功能非常强大。这个应用遵循了安卓设计和开发的最佳方法&#xff0c;旨在给开发者提供实用的参考资料。无论你是新手…

即将被AI取代的工作

这个博客 100% 是由人类而不是机器人撰写的。至少在某种程度上&#xff0c;目前仍然需要内容作家。 你的工作怎么样&#xff1f;您是否想过人工智能&#xff08;AI&#xff09;是否有可能渗透到您生活的无形本质&#xff1f;您花费数年时间获得的所有知识、技能和经验是否会因…

golang学习笔记——go语言多文件项目运行的四种方式

go语言多文件运行技巧 有两个源码文件的go语言项目如何运行? go.modmain.go Trie.go 如何直接运行go run main.go会提示找不到文件。 # 在windows10下运行 $ go run main.go # command-line-arguments .\main.go:6:9: undefined: Constructor是真的找不到文件吗。其实不是。…

java基于SSM框架的在线学习系统设计与实现+vue论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

【面试宝典】图解ARP协议、TCP协议、UDP协议

一、ARP协议 二、TCP协议 三、UDP协议 四、TCP和UDP的区别

ZooKeeper 实战(二) 命令行操作篇

文章目录 ZooKeeper 实战(二) 命令行操作篇1. 服务端命令1.1. 服务启动1.2. 查看服务1.3. 重启服务1.4. 停止服务 2. 客户端命令2.1. 启动客户端2.2. 查看节点信息查看根节点详情 ls -s /添加一个watch监视器 ls -w /列举出节点的级联节点 ls -R / 2.3. 查看节点状态2.4. 创建节…

C++(9.5)——浅谈new和delete的实现原理

(注:本文是针对上篇文章中C内存管理的两个关键字)两个关键字原理的解析&#xff0c;对于这两个关键字的使用并没有什么影响&#xff0c;如果只想得知两个关键字的使用方法&#xff0c;则可以直接跳过本篇文章&#xff09; 目录 1. 引入&#xff1a; 2.operator new 与 operat…

【Linux笔记】进程等待与程序替换

一、进程的终止 1、进程退出码 在讲解进程的终止之前&#xff0c;先要普及一下进程的退出码概念。 我们父进程之所以要创建子进程&#xff0c;就是为了让子进程运行不一样的任务&#xff0c;那么对于子进程执行的这个任务执行完毕后的结果是否正确或者是否出差错&#xff0c…

学习笔记-数据库概念介绍

一.数据库概述 1.数据库: 存储数据的仓库,本质是一个文件系统. 用户可以对数据库中的数据进行 增加,修改,删除以及查询操作 2.特点 可以结构化存储大量的数据可以有效的保持数据的一致性,完整性读写效率高 3.常用数据库 二.数据库分类及其常用 关系型数据库 指的是二维表格…

渗透测试:保障网络安全的重要手段!

随着信息技术的快速发展&#xff0c;网络安全问题日益受到关注。渗透测试作为一种重要的网络安全检测和评估方法&#xff0c;已经成为保障网络安全的重要手段之一。本文将介绍渗透测试的基本概念、流程、以及在保障网络安全方面的应用。 一、渗透测试的基本概念 渗透测试是一…

linux 服务器上安装 ftp(亲测有效)

目录 1 需求2 安装 1 需求 服务器上需要安装ftp 2 安装 1 下载地址 https://developer.aliyun.com/packageSearch?wordvsftpd或者 https://rpmfind.net/linux/rpm2html/search.php?queryvsftpd2 如何判断 服务器是否安装了ftp rpm -qa | grep vsftpd出现提示则表示已安装…

【从0上手cornerstone3D】如何渲染一个基础的Dicom文件(含演示)

一、Cornerstone3D 是什么&#xff1f; Cornerstone3D官网&#xff1a;https://www.cornerstonejs.org/ 在线查看显示效果&#xff08;加载需时间&#xff0c;可先点击运行&#xff09;&#xff0c;欢迎fork 二、代码示例 了解了Cornerstone是什么&#xff0c;有什么作用后&…

解决elementUI或elementPlus的按钮点击后需要失去焦点才能恢复原本样式问题

废话不多说直接上代码&#xff0c;只需要在button中添加如下代码即可 focus"(e) > e.target.blur()"

精确掌控并发:分布式环境下并发流量控制的设计与实现(二)

3. 固定窗口 参考&#xff1a;精确掌控并发&#xff1a;分布式环境下并发流量控制的设计与实现&#xff08;一&#xff09;-CSDN博客 4. 滑动窗口 滑动窗口算法是一种更为灵活的流量控制方案&#xff0c;它比固定窗口算法能更平滑地处理突发流量。在滑动窗口中&#xff0c;时…

什么是云服务器ECS及其优势、购买、使用方式和部署建议

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云百科aliyunbai…

UE5 通过接口实现角色描边效果

接口不能够被实例化&#xff0c;不能够在内部书写函数的逻辑和设置属性&#xff0c;只能够被继承使用。它能够让不同的类实现有相同的函数&#xff0c;继承接口的类必须实现接口的函数。 并且&#xff0c;我们可以在不同的类里面的函数实现也不同&#xff0c;比如A类描边是红色…