在计算机科学和组合数学中,卡特兰数(Catalan Number)是一类非常重要的数列,广泛应用于括号匹配、二叉树计数、出栈序列等问题。本教程将带你从零开始理解卡特兰数的概念,并使用C++语言实现几种常见算法,包括递归、递推公式和动态规划方法。
卡特兰数是一个整数序列,其前几项为:
1, 1, 2, 5, 14, 42, 132, ...
第 n 项卡特兰数(通常记作 Cₙ)可以表示为:
Cₙ = (2n)! / ((n+1)! * n!)
也可以用递推关系表示:
C₀ = 1,且 Cₙ₊₁ = Σᵢ₌₀ⁿ Cᵢ × Cₙ₋ᵢ
直接根据递推公式实现,适合理解原理,但时间复杂度高(指数级)。
#include <iostream>using namespace std;long long catalanRecursive(int n) { if (n <= 1) return 1; long long res = 0; for (int i = 0; i < n; i++) { res += catalanRecursive(i) * catalanRecursive(n - 1 - i); } return res;}int main() { int n = 5; cout << "C_" << n << " = " << catalanRecursive(n) << endl; return 0;}
使用动态规划避免重复计算,时间复杂度 O(n²),空间复杂度 O(n)。
#include <iostream>#include <vector>using namespace std;long long catalanDP(int n) { vector<long long> dp(n + 1, 0); dp[0] = dp[1] = 1; for (int i = 2; i <= n; i++) { for (int j = 0; j < i; j++) { dp[i] += dp[j] * dp[i - 1 - j]; } } return dp[n];}int main() { int n = 5; cout << "C_" << n << " = " << catalanDP(n) << endl; return 0;}
直接使用组合数学公式 Cₙ = C(2n, n) / (n+1),通过优化计算避免大数溢出。
#include <iostream>using namespace std;long long binomialCoeff(int n, int k) { long long res = 1; if (k > n - k) k = n - k; // 利用对称性 for (int i = 0; i < k; i++) { res *= (n - i); res /= (i + 1); } return res;}long long catalanFormula(int n) { long long c = binomialCoeff(2 * n, n); return c / (n + 1);}int main() { int n = 5; cout << "C_" << n << " = " << catalanFormula(n) << endl; return 0;}
通过本教程,你已经掌握了卡特兰数的基本概念及其在C++算法中的三种实现方式。对于初学者,建议先理解递归思想;在实际编程中,优先使用动态规划或组合公式法以提高效率。无论你是准备面试还是学习组合数学,掌握递推公式和这些实现技巧都将大有裨益。
关键词回顾:卡特兰数、C++算法、递推公式、动态规划
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129247.html