package _20th_ex;
public class Arrange25 { private static void f(String s) { StringBuffer stringBuffer = new StringBuffer(s); f(new StringBuffer(), stringBuffer); }
private static void f(StringBuffer s1, StringBuffer s2) { if (s2.length() == 0) { System.out.println(s1.toString()); } else { for (int i = 0; i < s2.length(); i++) { f(new StringBuffer(s1.append(s2.charAt(i))), new StringBuffer( s2.deleteCharAt(i))); } } }
public static void main(String[] args) { f("abc"); } }
console在“abc”的情况下总是输出abc/n acb/n
通过分析,发现递归在开始的时候的循环,s2.length()的长度明明是3,但是只循环一次,没道理呀!
各位看看这是怎么回事,小程序而已,不吝赐教!
其实我的思路本来就很对,一开始就是这样,但是必须对s1和s2的副本进行操作。
现在附上我的代码。经测试,完全正确。
package _20th;
public class A { private static long count = 0;
private static void f(String s) { // TODO Auto-generated method stub StringBuffer stringBuffer = new StringBuffer(s); f(new StringBuffer(), stringBuffer); }
private static void f(StringBuffer s1, StringBuffer s2) { // TODO Auto-generated method stub if (s2.length() == 0) { System.out.println(s1.toString()); count++; } else { for (int i = 0; i < s2.length(); i++) { StringBuffer t1 = new StringBuffer(s1); StringBuffer t2 = new StringBuffer(s2); t1.append(s2.charAt(i)); t2.deleteCharAt(i); f(t1, t2); } } }
public static void main(String[] args) { f("abcde"); System.out.println(count); } } 最后count的结果是54321=120. ######回复 @李嘉图 : 我擦,牛逼啊!这是怎样一种心情呢!######回复 @wenming199 : 谢谢你,同时提醒各位,细节很重要呀,说这句话的时候,我是含着眼泪的,要不然你思路再好也是扯淡!######回复 @李嘉图 : 这个要求倒是第一次听说,哈哈……总的来说干的不错……######回复 @铂金眼 : 我是想了10几个小时才出的,你们回答好了,我更高兴呀,但是事实是最后还是我找到答案了!我从昨天下午到今天下午,不停地测试,找答案,我付出了很多的!下面的附上代码的我试了,到说这句话的时候都是不太完美的!######我擦,LZ自己提问,自己回答,然后自己设自己为最佳答案,作弊啊! @红薯######我的程序由于,初始的递归里面的循环只循环一次,导致“abc”输出2个,“abcd”输出3个,”abcde“输出4个,都是因为初始的递归只循环一次,这不科学呀!######我从昨天下午,想到今天上午,发现不知道为什么初始的递归只循环一次,为什么?救救我吧!######你的代码格式看着累眼,就没心情看问题了....######看看吗,自己也可以长进的,在帮助别人的同时。######我的win8.1的ie11,那个插件代码的插件不兼容呀,你可以复制到eclipse里面,然后ctrl+shift+f就行了,那样就舒服了!###### 难道我要出“abc”的递归,需要使用
f("abc"); f("bac"); f("cab");
这不行呀,不符合我的思路呀! ######别告诉我你们都不用递归,学算法的时候,你们都没听!这不科学呀!###### 这代码写的真揪心啊。。。还循环递归new StringBuffer ######stringbuffer对于可变字符串的效率比较高!###### 你删除的索引是i,删除完以后,字符串索引是不是重建了?
你看看是不是因为这个问题? ######
public class Arrange25 {
static int i = 0;
private static void f(String s) {
if (i < s.length()) {
System.out.println(s.charAt(i) + s.replace(String.valueOf(s.charAt(i)), ""));
i++;
f(s);
}
}
public static void main(String[] args) {
f("abc");
}
}
######回复 @李日飞 : 3个字符串 全排列是3 21=6个,就是A3. abc acb bac bca cab cba######回复 @李嘉图 : 给abc现在输出的是这样 abc bac cab 你想变成什么样######回复 @李日飞 : 全排列!######回复 @李嘉图 : 你要什么样的效果######你的全排列思路很好,貌似效率也比较高,但是依然是错的!###### 1. For循环里面用递归?版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。