全排列的理解2

递归全排列,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位重复这种操作了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值