博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全排列的理解2
阅读量:5916 次
发布时间:2019-06-19

本文共 944 字,大约阅读时间需要 3 分钟。

递归全排列,start 为全排列开始的下标, length 为str数组的长度

void AllRange(char* str, int start, int length){    if (start == length - 1) {        printf("%s\n", str);    } else {        for (int i = start; i <= length - 1; i++) {	//从下标为start的数开始,分别与它后面的数字交换            Swap(&str[start], &str[i]);            AllRange(str, start + 1, length);            Swap(&str[start], &str[i]);        }    }}void Permutation(char* str){    if (str == NULL)        return;    AllRange(str, 0, strlen(str));}复制代码

for循环的理解

以abcd为例,第一位初始为a,那么后续第一位可以通过

for (int i = start; i <= length - 1; i++) {	Swap(&str[start], &str[i]);}复制代码

来保证b、c、d都可以做第一位。

第一位确定了,就可以继续对后面的3位也做这种处理,也就是这一行代码

AllRange(str, start + 1, length);复制代码

那么什么时候是终止的时候呢? 毫无疑问,肯定是走到了最后一位,再也没有可以继续交换的情况了,也就是

if (start == length - 1) {	printf(...)}复制代码

还有一行代码需要理解

Swap(&str[start], &str[i]);复制代码

这是说,既然a 与 b互换了,b 做了第一位了,下一步该a与c互换,让c来做第一位了,因此把 之前交换的ab再换回来,重新回复到abcd的情况,通过for循环的再次执行,让a 与 c 互换,这样,c就可以为第一位,然后就是继续后面的3位重复这种操作了。

转载地址:http://rjzvx.baihongyu.com/

你可能感兴趣的文章
matplotlib 交互式导航
查看>>
eclipse的插件未安装成功
查看>>
UnicodeEncodeError: 'ascii' codec can't encode
查看>>
jvm在什么时候进行进行垃圾回收,在什么时候进行扩大内存
查看>>
【转载】强大的命令行工具wmic
查看>>
如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招
查看>>
云越发展,锁定问题就会越严重?
查看>>
用户访问网页的流程原理
查看>>
各种链接
查看>>
我的友情链接
查看>>
《Spring实战》第四版读书笔记 第一章 Spring之旅
查看>>
那些年,一起学的Java 2-4
查看>>
RedHat已更改其开源许可规则
查看>>
redis集群搭建
查看>>
LNMP架构 (Ⅱ)——nginx相关配置、nginx代理
查看>>
神级python程序员只需要一个公众号,再也不会错过重要资讯
查看>>
双十一流量洪峰 支撑阿里核心业务的云数据库揭秘
查看>>
OSChina 周一乱弹 ——程序员跟产品经理撕逼必须掌握的套路
查看>>
Linux系统启动流程详解
查看>>
Magento(CE1.X)自带模块解析五
查看>>