在学习多线程时学习做一个密码破解小程序,其中在写暴力破解的方法时出现了个递归调用方面的陷阱困扰了我很长时间,特此记下一笔:
场景:写一个3位长度的字符串(数字、大小写字母),通过程序罗列出所有的组合
方法一:
采用多层循环
public static void main(String[] args) {
char[] chars = new char[3];
for(char i='0';i<='z'+1;i++) {
if(!Character.isLetterOrDigit(i)) {
continue;
}
chars[0] = i;
for(char j='0';j<='z'+1;j++) {
if(!Character.isLetterOrDigit(j)) {
continue;
}
chars[1] = j;
for(char k='0';k<='z'+1;k++) {
if(!Character.isLetterOrDigit(k)) {
continue;
}
chars[2] = k;
System.out.println(Arrays.toString(chars));
}
}
}
}
这种嵌套循环的方式可以找出所有组合,但是不容易扩展,例如现在要实现4位或5位的字符串。
现在考虑使用递归的方式解决
方法二:
递归调用
public class PojieThread extends Thread{
private boolean flag = true;
public void generateWord(char[] chars,String mima, int index) {
if(flag==true) {
for(short i='0';i<='z';i++) {
Character ch = (char)i;
chars[index] = ch;
if(index<chars.length-1) {
generateWord(chars, mima, index +1);
}else {
String str = new String(chars);
store.add(str);
System.out.println("插入-"+str);
if(str.equals(mima)) {
System.out.println("找到密码---"+str);
flag=false;
}
}
}
}
}
}
第一次在实现时,在递归调用的地方写为
generateWord(chars, mima, ++index);//错误写法
这就导致进入下一层的时候把本层的index自增了,也就导致chars[index]在错误的位置赋值,这个问题比较隐蔽,出问题后困扰了很长时间。
第二个问题出现在
if(str.equals(mima)) {
System.out.println("找到密码---"+str);
return;
}
我以为return会把这个递归给结束,但发现return只能结束本层循环,代码会返回上层继续执行。
解决方法:
添加全局的布尔变量做知否递归循环的标记