算法学习(一) 全排列的几种递归算法

      全排列是算法学习的一个初级问题,也是近几年IT公司比较热衷的问题。最近因为一个朋友的实际问题用到了类似全排列的算法,所以把相关的代码总结一下。

一、问题描述

      全排列的问题非常简单,比如给定三个数字1、2、3,请将三个数字的所有排列组合按大小顺序给出。这样我们期待的结果就是:123,132,213,231,312,321

二、第一种递归算法分析

      对于给定的n个数字,显然有n!种排列方式。关键在于怎样将所有的排列得到,一种显然的方式是首先选出第一位上的数字,然后回溯选择第二位上的数字,然后是第三位……只需要确保每一位上选择的数字不重复就可以了。这种算法比较好理解,递归也比较好设计,先上代码(c++):

 1 #include<iostream>
 2 #include<fstream>
 3 using namespace std;
 4 
 5 ifstream fin;
 6 ofstream fout;
 7 int flags[100];
 8 int numbers[100];
 9 int n;
10 
11 void search(int loc){
12     if(loc==n){
13         fout<<numbers[0]+1;
14         for(int i=1;i!=n;i++)
15             fout<<","<<numbers[i]+1;
16         fout<<endl;
17     }else{
18         for(int i=0;i!=n;i++)
19             if(flags[i]){
20                 flags[i]=0;
21                 numbers[loc]=i;
22                 search(loc+1);
23                 flags[i]=1;
24             }
25     }
26 }
27 
28 int main(){
29     
30     //fin.open("input.txt",ios::in);
31     fout.open("QPL.txt",ios::out);
32     
33     cin>>n;
34     for(int i=0;i!=n;i++)
35         flags[i]=1;
36     search(0);
37 }

      算法的关键就是search函数的实现。首先是退出条件的确定,search函数从左到右每个坑里填一个数字,当loc==n的时候填完所有的坑,这样一个排列便完成了。然后是往每个坑里填数字的过程,就是那个for循环,对于每个坑数字从0到n填,同时判定没有重复使用。

      这种实现的好处是比较直观,可拓展性比较强。大家可以试一下修改边界条件的判定标准会有什么效果。

三、第二种递归算法分析

      网上还有这样一种看似简洁的递归算法。算法通过观察全排列的产生方式,以123为例,他的全排列为123,132,213,231,312,321.通过观察可以发现,123的全排列就是1+(23的全排列)加上2+(13的全排列)加上3+(12的全排列)这里的递归的设计就是1+perm(23)然后交换1和2再执行2+perm(13)然后交换2和3执行3+perm(23)。

      代码设计如下:

 1 #include <iostream>
 2 #include <fstream>
 3 #include <stdlib.h>
 4 
 5 using namespace std;
 6 
 7 void swap(char *a,char *b)
 8 {
 9     char temp;
10     temp=*a;
11     *a=*b;
12     *b=temp;
13 }
14 
15 void Perm(char *pszStr, int k, int m)
16 {
17     if (k == m)
18     {
19         static int s_i = 1;
20         cout<<"the "<<s_i ++<<" line"<<pszStr<<endl;
21     }
22     else
23     {
24         for (int i = k; i <= m; i++) //第i个数分别与它后面的数字交换就能得到新的排列
25         {
26             swap(pszStr + k, pszStr + i);
27             Perm(pszStr, k + 1, m);
28             swap(pszStr + k, pszStr + i);//恢复现场
29         }
30     }
31 }
32 
33 int main(int argc, const char * argv[])
34 {
35     char str[]="1234";
36     Perm(str,0, 3);
37     return 0;
38 }

 

转载于:https://www.cnblogs.com/holmestian/p/3901528.html

算法递归——集合的全排列问题 集合全排列问题 设集合 R={ r1,r2,r3 … r n},显然全排列的数目为 n!。 那么如何显示集合的所有全排列呢? 可以用递归的方式实现。 解题思路 如果集合有n个元素,那么就可以看作 n-1个元素全排列之后再加上 剩下的那个元素,因为是全排列,所以每一个元素都会剩下一次。(例如: R={1,2,3}的全排列。 若 1 剩下,则 {2,3} 先进行排列,再与1结合,结果是 1 23,1 ... 阅读详情

相关推荐

全排列算法的递归与非递归实现

全排列算法的递归与非递归实现(java版) 问题定义 对于给定的集合A{a1,a2,…,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)。 例如:给定集合[1,2,3] 它的全排列子集为: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 递归算法(非...

lijianjian的博客 3031

全排列【递归】和【next_permutation]两种写法

1.递归写法 #include<iostream> #include<algorithm> using namespace std; int a[5] = { 1, 2, 3, 4, 5 }; void next(int k) { if(k == 5) { for(int i = 0; i < 5; i++) { printf("%d ", a[i]); } printf("\n"); return; } if(k &g

maniac_ran的博客 178

全排列问题非递归算法

全排列问题非递归算法,利用排序来进行实现

2301_79816227的博客 1256

全排列生成算法(一)

对于给定的集合A{a1,a2,...,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)。 递归算法 这里以A{a,b,c}为例,来说明全排列的生成方法,对于这个集合,其包含3个元素,所有的排列情况有3!=6种,对于每一种排列,其第一个元素有3种选择a,b,c,对于第一个元素为a的排列,其第二个元素有2种选择b,c;第一个元素为b的排列,第二个元素也有2种选择a,c,……,

joylnwang的专栏 5万+

全排列算法非递归实现和递归实现

全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。 首先来看看题目是如何要求的(百度迅雷校招笔试题)。 用C++写一个函数, 如 Foo(const char *str), 打印出

chlele0105的专栏 1万+

[递归] 全排列-C语言

C语言实现全排列算法

geodoer 8890

全排列—dfs(递归算法&&手动模拟)

1.dfs全排列深度优先算法思路导图 此图来自AC中的Hasity作者,万分感谢; 2.dfs递归思想 dfs就是一条路走到头,当无法再往下走时就往上退一步,再看有没有路可以走,如果还没有路的话就再回退一步,重复这个步骤,直到找到可以走的道路; 递归的主要思想在于不断调用本身的函数,层层深入,直到遇到递归终止条件后层层回溯,其思想与dfs基本吻合,从而调用递归实现dfs; 正如y总讲到的回溯,它是在计算机底层执行的(系统有一个隐藏的栈帮我们做回溯),我们无法看到,也不需要操作。因此,理解.

你相信光吗 1万+

手把手教你用Gazebo插件实现阿克曼底盘仿真(附Navigation2适配指南)

本文提供了一份完整的ROS2 Navigation2与Gazebo阿克曼底盘仿真全栈指南。从阿克曼运动学原理出发,详细讲解了如何构建URDF/SDF模型、集成gazebo_ros_ackermann_drive插件并进行PID调优,并重点阐述了如何深度适配Navigation2,包括配置Ackermann运动模型、调整规划器与恢复行为,最终实现从建图到自主导航的全流程仿真。

weixin_29310631的博客 398

全排列算法(递归)

但是,有一个问题,就是我该如何判定这个数用没用过,为了判断这个数,我们需要用一个tof数组(ture or false)来进行标记,也就是初始化一个tof数组,同时,我还需要初始化另一个数组ans[]来存储已经标记好的数。对于这类题,我们很直接了当的就知道可以用暴力枚举去完成算法,具体做法就是从1~3中任选一个数放在第一位,之后再从剩余的两个里面任选一个放在第二位,最后一个放在最后一位。:也叫递归函数,是递归算法的主体,它的作用就是不断调用自己,通过取不同的值来达到我们所需要的结果;(剩余部分不予展示)

2301_80147007的博客 1064

为什么你的SSE连接总断?深入对比EventSource与fetch-event-source的5大差异点

本文深入对比了原生EventSource与@microsoft/fetch-event-source库在SSE连接稳定性上的五大关键差异。重点剖析了后者在请求能力、连接控制、错误处理、数据解析及性能优化方面的优势,特别是其支持POST请求、自定义Header、精细化的重连策略与生命周期管理,为解决生产环境中SSE连接频繁断开的问题提供了专业方案。

weixin_28077113的博客 493

【游戏开发】初识寻路&navmesh,探索RecastDemo

在手游时代,尤其对于大世界游戏而言,寻路的实现基本在专门的寻路服务器上进行。在众多寻路的解决方案中,recastnavigation是最为经典实用的一个,很多游戏甚至游戏引擎都采用类似的实现。recastnavigation项目自带了RecastDemo,用图形化的界面帮助用户认识寻路网格(navmesh)的生成以及寻路的过程。因此,作为初学者的笔者,也决定通过RecastDemo去初步认识寻路的机理奥秘。 构建RecastDemo 首先克隆recastnavigation项目,从文档中可以看到Recast

HiKariのTechLab 3050

递归的几种类型

原文:https://blog.youkuaiyun.com/qq_34039315/article/details/78679029 1、阶乘 递归思想:n! = n * (n-1)! (直接看公式吧) 首先分析数列的递归表达式: int f(int n) { if(n<=1) return 1; else return n*f(n-1); } 2、斐波那契数列 斐波那...

Curtis’Blog 2665

FreeRTOS笔记(十五)FreeRTOS总结

文章目录01 - 裸机和FreeRTOS区别1.1 - 裸机1.2 - FreeRTOS1.3 - 区别02 - 对FreeRTOS的感受03 - 推荐 上一文链接:FreeRTOS笔记(十四)[简] 软件定时器、事件组、任务通知 01 - 裸机和FreeRTOS区别   学完FreeRTOS,应该要自己总结一下FreeRTOS和裸机的区别,宏观上说,FreeRTOS是一个运行在裸机上的微内核,...

单眼皮根号三的博客 4110

全排列(递归算法)

一.                                 全排列算法 首先:什么是全排列=》百度一下 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 公式:全排列数f(n)=n!(定义0!=1)   算法:递归算法=》网络上偷了一个图   全排列:顺便复习一

MsStrbig的博客 11万+

windows中通过docker部署LocateAnything-3B模型

windows中通过docker部署LocateAnything-3B模型

yilvyangguang520的博客 483

推荐11个顶级的Claude Code Skills

ClaudeCode的Skills系统为程序员提供了11个强大的AI辅助工具,包括代码审查、重构建议、单元测试生成、API文档自动生成、性能分析、安全扫描、数据库迁移脚本生成、CI/CD配置、依赖管理、ER图生成和日志分析等功能。这些"技能包"可大幅提升开发效率,从代码质量到协作沟通全方位优化工作流程。用户可根据需求选择2-3个核心功能开始尝试,熟练后还可自定义Skills。该系统需要配合Anthropic的API使用,建议先在小型项目测试再应用于核心业务。

分享AI、区块链技术及应用,未来已来 1847

全排列(递归)

1.全排列(递归) 给定一串无重复的字符或数字,输出其有所有排列,并统计其共有排列个数。 例:给定个数n(n

MrxiaoAXiao的博客 1万+

2026年03月CCF-GESP编程能力等级认证Scratch图形化编程一级真题解析

本文收录于《,订阅后可阅读专栏内所有文章。

人生就是一个不断学习的过程 237

算法学习之:全排列问题的递归算法(Perm)

【题目】 给出一个集合{1,2,3},求解该集合的全排列并打印。 全排列问题的递归算法(Perm) 【算法思想】 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R{ri}。 集合X中元素的全排列记为Perm(X)。 (ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀得到的排列。 R的全排列可归纳定义如下: 当n=1时,Perm(R)=(r),其中r是集合R中唯一的...

qq_42119136的博客 7927

166、电流环带宽测试

本文分享了电流环带宽测试的实战经验,揭示了常见误区:误将系统其他环节(如PWM、ADC、传感器)的延迟当作电流环性能。强调带宽测试需先断开速度/位置环,采用扫频法注入正弦信号,结合伯德图分析幅值与相位响应。关键点包括:控制频率步进为对数、确保采样时序精准、避免传感器带宽限制影响结果。文中指出“假带宽”现象(如鼓包、增益超0dB)多源于非线性或机械共振,建议遵循“先开环后闭环”“带宽非越高越好”“阶跃验证”三原则,并建立出厂基准曲线以支持后期故障诊断。

2401_88858637的博客 174

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

递归解决全排列生成算法

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列; 全排列:当n==m时,称为全排列; 比如:集合{ 1,2,3}的全排列为: { 1 2 3}  { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 方法一: 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3

xiazdong 4万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

全排列的递归算法

前面我们介绍了全排列的非递归算法,现在我再来写一下全排列的递归算法: 这两种算法的算法思路并不相同。递归算法的思路比较接近于我们现实生活中的思路。 1.试想,我们只有两个数字:12.要对它进行全排列,第一种方式就是12本身,第二种,将12交换,变为21即可。这提示了我们一种交换的思路。 2.但这概括的并不全面。试想,我们要对123进行全排列。我们可以采用将1固定,“23”进行全排列,将“2”

2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

(算法)全排列的递归算法Java实现过程

(算法)全排列的递归算法Java实现过程 一、无重复项的全排列 全排列的数学定义就不再过多解释,考虑递归算法的实现可从下面几点入手(以数组为例,如对其他元素排列,将元素编号放入数组即可): 1、一个数的全排列,如排列{1},就是这个数本身这一种情况 2、两个数的全排列,如排列{1,2}: 第一步:将{1}放在第零个位置,剩下的{2}进行一个数的全排列,结果为{1,2} 第二

Sirm23333 1万+

【递归】递归全排列的简单分析(三种全排列代码整理)

书本资料来源于: 【计算机算法设计与分析(第五版)】【王晓东】【电子工业出版社】 1.【例2-4】排列问题 P13 #include &amp;amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;amp;gt; using namespace std; int sum=0; void Perm(int list[],int k ,int m) { if(k==m) { for(int i=0;i&amp;amp;amp;amp;

○( ^皿^)っHiahiahia…的博客 8038

详解全排列算法的递归实现

全排列算法现在在很多的程序中需要使用,而且也是一个非常重要且常见的算法,其实全排列算法是一种非常典型的递归算法。 接下来我就用我所理解的全排列递归算法给大家讲一下: 这样的算法的得到基于下面的分析思路。 给定一个具有N个元素的集合(N>=1),然后要求输出这个集合中各个元素的全部可能的排列。其中排列的可能性为N!种。 递归算法实现: 比如,我们假设集合是{A,B,C...

gaorutao0923的博客 2229
上一篇: 终于开博啦!
下一篇: 算法学习(二) 全排列问题的非递归算法——模拟堆栈
devcd88044
博客等级 码龄12年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值