我正在创建一个蛮力程序,它只运行可能的字符串(当然,仅出于教育目的),我遇到了问题...
当我做 :
package com.arinerron.tools.Tools;
/**
*
* @author aaron
*/
public class BruteForce {
public static char[] CHARSET_ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n'};
private char[] CHARSET = {'a', 'b', 'c', 'd'};
private int LENGTH = 3;
private int sofar = 1;
public BruteForce(char[] charset, int length) {
this.CHARSET = charset;
this.LENGTH = length;
}
public String bruteForce() {
go("");
return "";
}
private void log(String t) {
System.out.println(t);
}
private void go(String w) {
for(int i = 0; i != this.CHARSET.length; i++) {
String txt = w + this.CHARSET[i];
if(sofar < LENGTH) {
go(txt);
} else {
}
System.out.println(txt);
}
sofar++;
}
public static void main(String[] args) {
BruteForce bf = new BruteForce(BruteForce.CHARSET_ALPHABET, 2);
bf.bruteForce();
}
}
我得到:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.StringBuilder.append(StringBuilder.java:136)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:32)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
at com.arinerron.tools.Tools.BruteForce.go(BruteForce.java:34)
为什么?计算机看起来并不难...:\
最佳答案
问题是您在错误的位置增加了sofer变量。开始新递归的条件将始终为true,这将导致堆栈溢出。
想想sofer变量何时增加。尝试将sofar++;
移到递归调用go(txt)
之前,然后看看会发生什么。
所以:
private void go(String w) {
for(int i = 0; i != this.CHARSET.length; i++) {
String txt = w + this.CHARSET[i];
if(sofar < LENGTH) {
sofar++;
go(txt);
}
System.out.println(txt);
}
}
附带说明一下:为什么要从
bruteForce()
方法返回一个空字符串?无效不会更有意义。