全排列问题(递归)

上次上课老师讲了全排列算法,现在刚刚看自己的写的全排列算法,看了好一会才看懂。。。。

应该是自己理解的不够彻底

所以今天彻彻底底的来分析一下

先看图:

思路:

先固定一个字符,然后将固定的字符与它后面的每一个进行交换,一直递归下去,直到固定的字符后面只有一个字符

我们先看看图,框外面的字符是被固定的字符,框里面的字符的没有被固定的字符,具体做法就是每次将框里面的第一个字符与框里面的字符交换(框里面第一个与第一个交换,第一个与第2个交换,第一个与第3个交换.........第1个与第n个交换),直到框里面只剩下一个字符的时候,输出此时的字符排列,但是输出之后又要将字符的位置还原会来。。。(我觉得我讲的有点不太好理解),所以外面现在直接来对图分析吧

假设有abc三个字符,求全排列

看第0层,abc三个字符都在框里面,所以将第一个字符a和第一个字符,第二个字符,第三个字符交换得到:abc,bac,cba,这三个字符串构成了第1层,现在第一层的框里面还有两个字符,所以外面应该继续递归,直到框里面还剩下一个字符就输出这个字符串,所以第一层的abc字符串bc还在框里面,所以将b和b交换,将b和c交换,一共两种情况,(框里面第一个与第一个交换,第一个与第2个交换,第一个与第3个交换.........第1个与第n个交换,一共n种情况)

全排列可以看做固定前i位,对第i+1位之后的再进行全排列,比如固定第一位,后面跟着n-1位的全排列。那么解决n-1位元素的全排列就能解决n位元素的全排列了

代码如下:

#include<string.h>
#include<stdio.h>
int k=0;
char a[100];
long long count=0;//全排列个数的计数
void s(char a[],int i,int k)//将第i个字符和第k个字符交换
{char t=a[i];a[i]=a[k];a[k]=t;
}
void f(char a[],int k,int n)
{if(k==n-1)//深度控制,此时框里面只有一个字符了,所以只有一种情况,所以输出
    {puts(a);count++;}int i;for(i=k;i<n;i++){s(a,i,k);f(a,k+1,n);s(a,i,k);//复原,就将交换后的序列除去第一个元素放入到下一次递归中去了,递归完成了再进行下一次循环。这是某一次循环程序所做的工作,这里有一个问题,那就是在进入到下一次循环时,序列是被改变了。可是,如果我们要假定第一位的所有可能性的话,那么,就必须是在建立在这些序列的初始状态一致的情况下,所以每次交换后,要还原,确保初始状态一致。
    }
}
int main()
{gets(a);int l=strlen(a);//字符串长度
    f(a,k,l);printf("全排列个数:%lld\n",count);return 0;
}

有任何不足错误的地方欢迎拍砖指正哦!!!!!

技术在于分享

 

转载于:https://www.cnblogs.com/yinbiao/p/8684313.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php内核介绍及扩展开发指南,4.5. 发布扩展信息

发布扩展信息扩展可以发布 phpinfo() 或反射API要求的信息。我们一起来看一下。本章不会太长&#xff0c;因为真的很简单。MINFO( ) 挂钩如果声明了&#xff0c;一切都在声明的 MINFO() 挂钩中进行。如果未声明&#xff0c;则引擎将运行默认功能以打印有关扩展名的信息。该功能…

Ajax乱码解决方案

2019独角兽企业重金招聘Python工程师标准>>> 方案1: 页面端: <% page language"java" contentType"text/html; charsetgb2312" pageEncoding"gb2312"%> http://www.w3.org/TR/html4/loose.dtd"> Ajax: function ve…

花里胡哨,不协调统一的界面,正如看到一个穿花里胡哨衣服的人,让人作呕,不想接近。...

2019独角兽企业重金招聘Python工程师标准>>> 花里胡哨&#xff0c;不协调统一的界面&#xff0c;正如看到一个穿花里胡哨衣服的人&#xff0c;让人作呕&#xff0c;不想接近。 不要瞎变。 转载于:https://my.oschina.net/dongming/blog/40569

python全栈学习--day12(函数高级应用-带参数的装饰器,多个装饰器装饰一个函数)...

函数的执行时&#xff0c;*打散 函数的定义时&#xff0c;*聚合 from functools import wrapsdef wrapper(f):wraps(f)def inner(*args,**kwargs):执行函数之前的相关操作ret f(*args,**kwargs)执行函数之后的相关操作return retreturn inner wrapper def func1(*args):print…

选择排序法对数组进行排序

package selectionSort;import java.util.Arrays;public class Exam { //使用选择排序法对数组进行排序public static void main(String[] args) {int[] nums {23,3453,123,54,12,45,145,135,656,146,65};SelectionSort(nums);System.out.println(Arrays.toString(nums));}publ…

爬取校园新闻首页的新闻

1. 用requests库和BeautifulSoup库&#xff0c;爬取校园新闻首页新闻的标题、链接、正文。 import requests from bs4 import BeautifulSoup url requests.get("http://news.gzcc.cn/html/xiaoyuanxinwen/")url.encoding "utf-8" soup BeautifulSoup(…

php服务划分,云计算提供的服务分为哪三个层次

三个层次&#xff1a;1、基础设施即服务(IaaS)&#xff0c;向云计算提供商的个人或组织提供虚拟化计算资源&#xff1b;2、平台即服务(PaaS)&#xff0c;为开发人员提供通过全球互联网构建应用程序和服务的平台&#xff1b;3、软件即服务((SaaS)&#xff0c;通过互联网提供按需…

如何做个人职业规划和年度计划

在做规划的同时&#xff0c;已经结合工作和个人自身情况思考调整个人的职业规划以及2012年自己的学习成长计划。持续了大约2个月的时间&#xff0c;已经整理出了2012年自己的目标和计划。总结一下&#xff0c;制定个人规划大致分为几个步骤&#xff1a; 一、认识自己。主要包括…

centos 7 快速安装nginx

输入指令 vim /etc/yum.repos.d/nginx.repo 输入以下内容 [nginx] namenginx repo baseurlhttp://nginx.org/packages/centos/7/$basearch/ gpgcheck0 enabled1 wq 进行保存 验证是否安装成功 安装 yum install nginx 启动nginx服务 nginx 测试是否启动成功 在linux输入你的IP地…

matlab colorbar采用对数,matlab colorbar的使用 | 學步園

1&#xff1a;請問matlab中畫多張圖如何使用同一範圍的colorbar?例如生成了圖1,2,3生成圖1時&#xff0c;使用temp1caxis;將圖1的z值的取值範圍(即colorbar的取值範圍)取出。生成圖2,3時使用caxis(temp1)命令將圖2,3的z值的取值範圍設為同1相同。然後對各個同使用colorbar命令…

php拖拽原理,JS拖拽效果及原理解析

这篇文章主要介绍了如何实现js拖拽效果及原理解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下元素拖拽分成3个步骤&#xff1a;按下鼠标&#xff0c;移动鼠标&#xff0c;松开鼠标。拖拽原理&#xff1a;按下…

jqGrid细节备注—pager文字的设置,更改默认的提交方式

默认的pager显示的文字&#xff0c;在英文版本下是如下 (file grid.locale-en.js): $.jgrid { defaults : { recordtext: "View {0} - {1} of {2}", emptyrecords: "No records to view", loadtext: "Loading...", pgtext : "Page {0} of …

浅谈拓扑排序

今天来讲讲拓扑排序 度娘告诉我 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点u和v&#xff0c;若边(u,v)∈E(G)&#xff0c;则u在线性序列中出现在v之前。通常&#xff0c;这样…

makemid+matlab,《MATLAB基础》双语课

MATLAB双语教学视频第17讲MATLAB双语教学视频第18讲Summarizing DataIn this section...“Overview” on page 5-10“Measures of Location” on page 5-10“Measures of Scale” on page 5-11“Shape of a Distribution” on page 5-11OverviewMany MATLAB functions enable y…

php获取页面的可视内容高度,网页制作技巧:获取页面可视区域的高度_css

文章简介&#xff1a;获取页面可视区域高度&#xff0c;获取页面高度&#xff0c;获取滚动条滚动上去的页面高度.function getWH(){ var wh {}; "Height Width".replace(/[^/s]/g,function(a){ var b a.toLowerCase(); wh[b]window["inner".concat(a)] d…

安装与配置-以前的某个程序安装已在安装计算机上创建挂起的文件操作......

今日在Windows XP SP2的计算机上&#xff0c;安装SQL Server 2000 Standard Edition&#xff0c;安装不上&#xff0c;错误信息如下&#xff1a; 文字描述为&#xff1a; 以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机。 解决方法…

带预览图的js切换效果!

效果图&#xff1a; js代码&#xff1a; var isIE (document.all) ? true : false;var $ function (id) {return "string" typeof id ? document.getElementById(id) : id; };var Class {create: function() {return function() { this.initialize.apply(this,…

Python成长之路【第七篇】:Python基础之装饰器

一、什么是装饰器 装饰&#xff1a;装饰既修饰&#xff0c;意指为其他函数添加新功能 器&#xff1a;器既函数 装饰器定义&#xff1a;本质就是函数&#xff0c;功能是为其他函数添加新功能 二、装饰器需要遵循的原则 1、不能修改装饰器的源代码&#xff08;开放封闭原则&#…

sql数据库与oracle数据库同步,[sql数据库同步]Oracle与SQL Server如何实现表数据同步...

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件数据库的Oracle版本为10.2&#xff0c;并安装在Linux系统上。数据库SQL Server的版本是SQL 2005&#xff0c;已安装在Windows XP系统上。现在我们需要做的是在两个数据库表之间同步数据。现在&#xff0c;最…

零食嘴----美食领域的美丽说

零食嘴美食分享社区首页 阿里巴巴参谋长曾鸣曾说过&#xff1a;“淘宝等美丽说模式整整等了两年。不仅在女性领域&#xff0c;阿里希望在各个维度都出现‘美丽说’。” 零食嘴就是美食领域美丽说。 所谓的美丽说模式&#xff0c;是指社会化电子商务分享的模式&#xff0c;在一个…