一个递归的陷阱

在学习多线程时学习做一个密码破解小程序,其中在写暴力破解的方法时出现了个递归调用方面的陷阱困扰了我很长时间,特此记下一笔:

场景:写一个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只能结束本层循环,代码会返回上层继续执行。 

解决方法:

添加全局的布尔变量做知否递归循环的标记

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值