当前位置: 首页 > news >正文

数据结构:递归:组合数(Combination formula)

目录

推导组合数的递归公式

杨辉三角 = 组合数图谱

🌳递归调用树可视化

代码实现


我们来分析“递归中的 Combination formula 问题”,也就是常说的组合数计算问题

推导组合数的递归公式

什么是组合问题?

组合问题的本质是从 n 个元素中选择 k 个元素,不考虑顺序,有多少种选法。

Step 1: 从一个最简单的事实出发

我们从两个最基本的事实(第一性)出发:

从 0 个数中选 0 个,有 1 种选法:C(0,0)= 1

从 n 个数中选 0 个,或者选 n 个,只有 1 种方式:C(n,0) = C(n,n) = 1

这是我们的边界条件(Base Cases)。 

Step 2:构建思维模型:是否包含第 n 个元素?

我们从一个关键思想出发:
从 n 个元素中选 k 个,可以分为两类情况:

  • 不选第 n 个元素:从前 n-1 个元素中选 k 个,记作 C(n-1, k)

  • 选第 n 个元素:剩下从前 n-1 个元素中选 k-1 个,记作 C(n-1, k-1)

所以,我们得到核心递归关系:

这就是组合数的递归本质 —— 不依赖任何公式推导的、基于逻辑分类讨论的解法。 

Step 3: 示例验证:

比如:从 4 个元素中选 2 个:

C(4, 2) = C(3, 2) + C(3, 1)

  • C(3, 2) =从前3个中选2个(不选第4个)

  • C(3,1)= 从前3个中选1个(因为已经选了第4个)

最终两者加起来就是从4个中选2个的方法总数。

🔍这就是递归(recursion)

  • 大问题 C(n,k)

  • 分解为两个更小的问题 C(n−1,k) 和 C(n−1,k−1)

  • 一直递归下去,最终会到达 base case:C(n,0) 或 C(n,n)


杨辉三角 = 组合数图谱

杨辉三角其实就是组合数的排列。三角形第 n 行的第 k 个数,就是: C(n,k)

Row n →          k →11     11     2     11     3     3     11     4     6     4     1
---------------------------------杨辉三角(Pascal's Triangle)

对应数值(左对齐)如下: 

n\k →  0   1   2   3   4
0     1
1     1   1
2     1   2   1
3     1   3   3   1
4     1   4   6   4   1

举例:

即:杨辉三角中每个数都是其左上和右上两个数之和。 

🌳递归调用树可视化

我们现在来画出计算C(4,2)的递归调用树,它完美对应杨辉三角的构建过程:

               C(4,2)/      \C(3,2)     C(3,1)/    \      /    \C(2,2) C(2,1) C(2,1) C(2,0)|       |     |      |1       ?     ?      1/ \   / \C(1,1) C(1,0) C(1,0) C(1,1)|     |     |     |1     1     1     1

所有底层节点(如 C(2,0), C(2,2), C(1,0), C(1,1))为 base case(边界条件)。

通过不断向下分解为两个更小的问题,每个组合数都是上层两个的和。

组合公式与递归的几何意义

  1. 杨辉三角的每一行的数值,都是通过上面两数之和得到;

  2. 这就意味着,从 n−1 行中,取 k−1 和 k 的值,就能得到 n 行的第 k 个值。

你可以这样理解:

  • C(n, k) 就像在杨辉三角中往下走到第 n 行第 k 个位置;

  • 这个点的值由它“上方的两个点”(即 C(n−1,k−1) 和 C(n−1,k))决定;

所以,组合公式其实是动态构建杨辉三角的路径图。

 ​​​​​​代码实现

 处理边界条件(base case)

    if (k == 0 || k == n)return 1;

思路说明:

  • 从 n 个中选 0 个只有 1 种方式:什么都不选;

  • 从 n 个中选全部(即 k = n)也只有 1 种方式;

这就是我们的递归终止条件,防止无限递归。

✅ 写递归公式

    return combination(n - 1, k - 1) + combination(n - 1, k);

组合的核心递推思想是:

  • 选 or 不选当前元素:

    • 不选:从前 n−1 个中选 k 个;

    • 选了当前:从前 n−1 个中选 k−1个。

这正是递归的两个分支。

✅ 完整函数如下 

int combination(int n, int k) {if (k == 0 || k == n)return 1;return combination(n - 1, k - 1) + combination(n - 1, k);
}

完整代码

#include <iostream>
using namespace std;int combination(int n, int k) {if (k == 0 || k == n)return 1;return combination(n - 1, k - 1) + combination(n - 1, k);
}int main() {cout << combination(5, 2) << endl;  // 输出 10return 0;
}
http://www.dtcms.com/a/263709.html

相关文章:

  • vue3中实现高德地图POI搜索(附源码)
  • 主流零信任安全产品深度介绍
  • 网络的相关概念
  • 港美股证券交易系统综合解决方案:技术架构革新与跨境服务升级
  • docker windows 安装mysql:8.0.23
  • Next.js 安装使用教程
  • Zephyr RTOS 信号量 (Semaphore)
  • 基于3D卷积神经网络与多模态信息融合的医学影像肿瘤分类与可视化分析
  • 商品中心—17.缓存与DB一致性的技术文档
  • Linux: network: 性能 pause
  • 【项目笔记】高并发内存池项目剖析(二)
  • Leetcode力扣解题记录--第49题(map)
  • 二型糖尿病居家管理小程序的设计与实现(消息订阅、websocket及时通讯、协同过滤算法)
  • OpenCV CUDA模块设备层-----“小于阈值设为零” 的图像处理函数thresh_to_zero_func()
  • 学习面向对象
  • 渗透测试(Penetration Testing)入门:如何发现服务器漏洞
  • 第2章,[标签 Win32] :兼容 ASCII 字符与宽字符的 Windows 函数调用
  • React:利用React.memo和useCallback缓存弹窗组件
  • 欢乐熊大话蓝牙知识24:LE Secure Connections 是 BLE 的安全升级术
  • HarmonyOS应用开发高级认证知识点梳理 (一) 布局与样式
  • 微信小程序使用秋云ucharts echarts
  • 利用springEvent,进行服务内部领域事件处理
  • 安卓接入百度定位和地图SDK
  • Go并发模式精要:掌握Goroutine与Channel的实战艺术
  • 开篇:GORM入门——Go语言的ORM王者
  • 物联网数据洪流下,TDengine 如何助 ThingLinks 实现 SaaS 平台毫秒级响应?
  • LabVIEW调用Excel宏实现数据可视化
  • 4D 毫米波雷达
  • 21、鸿蒙学习——使用App Linking实现应用间跳转
  • SQL Server 进阶:递归 CTE+CASE WHEN 实现复杂树形统计(第二课)