2015-07-11 76 views
0

我創建一個蠻力程序只是通過可能的串運行,(對於教育的目的只有課程),我有一個問題... 當我這樣做:暴力破解 - 的StackOverflowError

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) 

爲什麼?它看起來並不難,電腦處理...:\

回答

1

問題是,你增加了變量變量在錯誤的地方。開始新遞歸的條件將始終爲真,並導致堆棧溢出。

想想當變量變量增加。嘗試將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()方法返回一個空字符串?不會失效更有意義。

+0

是的,它會在稍後我要實現它。現在,只是一個空的字符串! :) –

+0

等等,讓程序運行,我應該移動sofar ++;去後(txt); –

+0

@FnafServer不,你必須先遞增,否則你永遠不會退出遞歸 – jpw

相關問題