排列组合问题
基本的排列组合问题,就是高中数学的内容,怎么用编程语言输出所有排列呢?我们手写的过程,它应该是一个递归的过程,而不适合用for/wihle循环。如果数据结构学的扎实,可以发现这是一个树结构,遍历所有的叶子节点就能够得到全排列。说到递归,应该向大家隆重介绍一下数学归纳法的思想,应为都有一个问题规模n。然后树可以演变成图,然后就对深度优先遍历,还是广度优先遍历算法的各个形式要很熟悉。
有一个金典的问题是找零钱问题统计。
其实这种类似问题,往深了挖,本质就是图的问题,改天附上图片,并说明一些问题.
递归方法实现排列问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public void permutation(List<List<Integer>> res,Stack<Integer> path,List<Integer> remaining, int k){ // 无路可走或者到达最大层次 if (remaining.size()== 0 || k<= 0 ){ List<Integer> ls = new ArrayList(path); res.add(ls); return ; } for ( int i= 0 ;i<remaining.size();i++){ Integer ele = remaining.get(i); path.push(ele); List<Integer> remaining2 = new ArrayList(remaining); // 可以选的点 remaining.remove(i); // 递归调用 permutation(res,path,remaining2,k- 1 ); path.pop(); } } |
参考资料:《计算机程序的构造和解释》
日进有功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义