目录:
- 代码:
- 分析:
- 汇编:
代码:
#include <stdio.h>/*程序描述:输出字符串所有的组合情况使用permutation函数进行将指定的下标值,与最大下标值这个范围的每个下标值进行交换每调用一次permutation函数表示只处理指定下标的值,每次指定位置交换后,再调用b+1进行后面一个位置的交换,直到要交换的位置的与最大下标值相等时,表示没得交换了输出该字符串,这次的函数出栈返回调用处(就是处理前一个字符的地方),将前一个位置的字符恢复回没交换的状态,再将前一个字符与后面字符交换,如果还可以交换就再次调用permutatuion函数处理后面的字符,要是不可以处理该位置的permutation函数就出栈,返回再前一个位置再进行同样操作总结:先从第一个字符处理,然后再每个字符调用permutation函数进栈,然后从倒数第二个开始与后面的交换没得交换后,处理倒数第三个,再回去处理倒数第二个。可以交换就交换,不行就返回处理交换前一个再回去处理交换后面的。
*//*
调换字符函数 (输出所有排列组合)
第一个参数:处理的字符串
第二个参数:要交换的下标在字符串中
第三个参数:可以交换最大值下标(字符串最后一个字符下标)
*/
void permutation(char s[], int b, int e)
{if( (0 <= b) && (b <= e) ){if( b == e )//如果调换的位置与最后一个字符位置相等时输出字符串{printf("%s\n", s);}else{int i = 0;//用于与当前位置(b)做交换的位置for(i=b; i<=e; i++)//循环将当前位置与后面的每个位置的数据交换(包括自己本身){char c = s[b];//取当前位置的值s[b] = s[i];//将要交换的值赋给当前位置s[i] = c;//将当前位置值赋给交换的位置permutation(s, b+1, e);//将当前位置的下一个位置调用调换字符函数进行下个位置的交换c = s[b];//将上面当前位置交换后,再交换回来s[b] = s[i];s[i] = c;}}}
}int main()
{char s[] = "abc";permutation(s, 0, 2);getchar();return 0;
}
分析:
汇编: