全排列的理解2

129 阅读1分钟

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