递归复习,递归输出字符串的全排列
/* 例子123进行全排列,那么包含以下几部分 1)1是第一位的时候,对剩下的2,3进行全排列; 2)2是第一位的时候(将2和1交换),对剩下的1,3进行全排列; 3)3是第一位的时候(将3和1交换),对剩下的1,2进行全排列; 可以看到,每次递归是后面的值和起始位置交换,但每次都要保证原始顺序不变(不然不能保证和1进行交换) 所以第一次交换是每次将后面的值一次交换到起始位置,再对后面的进行全排列; 第二次的交换是要将前面的交换再交换回来,保证最初的原始排列不发生变化。 */ #include<iostream> using namespace std; template <class Type> void Perm(Type list[], int k, int m) //list[k...m] //k和m分别表示要进行全排列的元素范围,即两个端点的index,k为开始的index,m为结束端点index。 { if(k==m) { for(int i=0; i<=m; i++) cout << list[i]; cout << endl; } else for(int j=k; j<=m; j++) { Swap(list[k],list[j]); Perm(list, k+1, m); Swap(list[k],list[j]); } } template<class Type> inline void Swap(Type &a, Type &b) { Type temp=a; a=b; b=temp; } int main(){ char ch[]="abc"; Perm(ch,0,3); }
原理就是
perm(abc)= a + perm(bc) ---a和a换,然后计算子问题,计算完了还原
+ b + perm(ac) --- a和b换,同上
+ c + perm(ba) --- a和c换,同上
子问题依此类推。
三个组合起来用for循环来处理。
for(int j=k; j<=m; j++) { Swap(list[k],list[j]);//将问题第一个元素和 [j] 交换。 Perm(list, k+1, m);// 计算子问题 即除了第一个元素的后面的全排列。 Swap(list[k],list[j]);//然后把 第一个元素 和[j]再换回来。 }
for循环 是 把 多个 递归 累加起来的。
分类:
数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!