我正在创建一个蛮力程序,它只运行可能的字符串(当然,仅出于教育目的),我遇到了问题...
当我做 :

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()方法返回一个空字符串?无效不会更有意义。

09-25 20:35