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