[code]
字母全排列
首先可以看出,全排列其实就是阶乘,3个字母会有3阶乘种表现,4字母会有4阶乘种
上面fat的变化是有规律的 ,我们要得到全排列的做法是: 将三个字母分别作为开头,然后
调整除了第一个字符之外的位置,即fat 将后两个调整 fta
当有4个字母时,如golf,那么分别让g,o,l,f打头,当g打头是后面是olf,那就可以回到上面fat的例子
这就是递归的表现,4个字母是四种字母打头的后面是3的全排列,3个字母又是3种字母打头的后面是2的全排列 就像第一行所示
其实递归就是一种封装,一种面向对象,或者说是面向责任。。。所以递归责任链中的每一个职责执行者标识符肯定有区别。。。。这里的标识符就是start...而且在递归中最后一个责任执行者所做的事情与前面的人做的完全不一样,所以需要判断是否是最后一个执行者。。。。。
//每一级所做的事情:使得char[]中的每个元素都充当首元素
//传递规则: 把除了首字母的char[]传递下去
//归的条件: 如果全部搞完,则重头到尾打印一次
什么叫全排列。。。其实就是要得到全部的结果,而不是一个结果,从技术角度说,一次递归只可能得到一个结果,但是这里在递归中有循环,也就意味着有分支了。。所以这样可以造成多个结果,与倒油问题不同,这里每一次数组都会递减。。。而倒油问题的油桶每一次都是一样的。。。。。
public static void main(String[] args) {
String string = "123";
doAnagram(string.toCharArray(), 0, string.length() - 1);
}
public static void doAnagram(char[] c, int start, int end) {
char temp;
if (start == end) {
for (int i = 0; i <= end; i++)
System.out.print(c[i]);
System.out.println();
} else {
for (int i = start; i <= end; i++) {
//把当前首元素与每个元素交换,使得每个元素都能充当首元素
temp = c[start];
c[start] = c[i];
c[i] = temp;
doAnagram(c, start + 1, end);
//因为当前元素被交换了,为了打印当前值,把交换的给交换回来
//注意:这里每一个都放到第一种位置有两种放发,第一种是:循环的把每个都放到头上,第二个是1,2交换,然后交换回来,然后1,3交换,然后交换回来,这样做的好处是不会打乱顺序,便于递归
temp = c[start];
c[start] = c[i];
c[i] = temp;
}
}
}
[/code]
字母全排列
首先可以看出,全排列其实就是阶乘,3个字母会有3阶乘种表现,4字母会有4阶乘种
上面fat的变化是有规律的 ,我们要得到全排列的做法是: 将三个字母分别作为开头,然后
调整除了第一个字符之外的位置,即fat 将后两个调整 fta
当有4个字母时,如golf,那么分别让g,o,l,f打头,当g打头是后面是olf,那就可以回到上面fat的例子
这就是递归的表现,4个字母是四种字母打头的后面是3的全排列,3个字母又是3种字母打头的后面是2的全排列 就像第一行所示
其实递归就是一种封装,一种面向对象,或者说是面向责任。。。所以递归责任链中的每一个职责执行者标识符肯定有区别。。。。这里的标识符就是start...而且在递归中最后一个责任执行者所做的事情与前面的人做的完全不一样,所以需要判断是否是最后一个执行者。。。。。
//每一级所做的事情:使得char[]中的每个元素都充当首元素
//传递规则: 把除了首字母的char[]传递下去
//归的条件: 如果全部搞完,则重头到尾打印一次
什么叫全排列。。。其实就是要得到全部的结果,而不是一个结果,从技术角度说,一次递归只可能得到一个结果,但是这里在递归中有循环,也就意味着有分支了。。所以这样可以造成多个结果,与倒油问题不同,这里每一次数组都会递减。。。而倒油问题的油桶每一次都是一样的。。。。。
public static void main(String[] args) {
String string = "123";
doAnagram(string.toCharArray(), 0, string.length() - 1);
}
public static void doAnagram(char[] c, int start, int end) {
char temp;
if (start == end) {
for (int i = 0; i <= end; i++)
System.out.print(c[i]);
System.out.println();
} else {
for (int i = start; i <= end; i++) {
//把当前首元素与每个元素交换,使得每个元素都能充当首元素
temp = c[start];
c[start] = c[i];
c[i] = temp;
doAnagram(c, start + 1, end);
//因为当前元素被交换了,为了打印当前值,把交换的给交换回来
//注意:这里每一个都放到第一种位置有两种放发,第一种是:循环的把每个都放到头上,第二个是1,2交换,然后交换回来,然后1,3交换,然后交换回来,这样做的好处是不会打乱顺序,便于递归
temp = c[start];
c[start] = c[i];
c[i] = temp;
}
}
}
[/code]