麻烦的递归方法java

时间:2016-12-08 18:58:45

标签: java brute-force

基本上我有一个强力密码猜测器(我意识到它不是很有效)我有一个进程我想进入一个递归方法,我可以传递长度整数,它将运行那个数量的字符。 这是代码:

public static void generatePassword(int length)
{
    // should be a recusive function learn how to do that
    // 1 interval
    for(int i =32;i<127;i++)// ascii table length
    {
                System.out.println((char)i);

    }
    // 2 interval
    for(int z =32;z<127;z++)// ascii table length
    {
        for(int q =32;q<127;q++)// ascii table length
        {
            System.out.println((char)z+""+(char)q);

        }

    }
    // 3 interval
    for(int w =32;w<127;w++)// ascii table length
    {
        for(int o =32;o<127;o++)// ascii table length
        {
            for(int g =32;g<127;g++)// ascii table length
            {
            System.out.println((char)w+""+(char)o+""+(char)g);
            }
        }


    }

}

间隔返回一个带有该长度的字符串示例:第三个间隔将返回每个可能的字符串组合,长度为3.如果有人可以帮助我自动执行此过程并解释(我想学习而不是复制和粘贴)会很好 ! :)

3 个答案:

答案 0 :(得分:1)

递归方法是一种调用自身的方法,它有一个基本条件(也称为停止条件),可防止它进入无限循环。

让我们以第一个间隔为例:

for(int i = 32; i < 127; i++) { // ascii table length
    System.out.println((char)i);
}

我们可以创建一个递归方法来做同样的事情:

private void interval1(int i) {
    if (i < 32 || i >= 127) return;
    System.out.println((char)i);
    interval1(i + 1);
}

为了将它用于我们的用例,我们应该使用i = 32调用此方法:interval(32)

希望这有帮助!

答案 1 :(得分:1)

以下是使用递归实现的方法:

public static void generatePassword(int length, String s) {
        if (length == 0) {
            System.out.println(s);
            return;
        }
        for (int i = 32; i < 127; i++) {
            String tmp  = s+((char) i);
            generatePassword(length - 1, tmp);
        }
    }

您所要做的就是将长度和初始字符串(即&#34;&#34;)传递给它。
在if语句处检查,是否应该停止递归(当生成的密码的长度等于预期时) 在for循环中,有一个新的字符被添加到实际的String中,并且该方法以较短的长度和一个新的String作为参数调用。

希望它有所帮助。

答案 2 :(得分:1)

功能

请注意,这将是非常不充分的。这不应该在实践中完成,因为创建的String对象的数量是MIND-BOGGLINGLY HUGE(参见答案的底部)

public void recursivePrint(String prefix, int levels) {
    if (levels <= 1) {
        for (int i = 33; i < 127; ++i) {
            System.out.println(prefix+(char)i);
        }
    } else {
        for (int i = 33; i < 127; ++i) {
            recursivePrint(prefix+(char)i, levels-1);
        }
    }
}

然后你用:

来称呼它
recursivePrint("", 5); // for printing all possible combinations of strings of length 5

它的工作方式

对函数的每次调用都有自己的内存,并且单独存储。当您第一次调用该函数时,会有一个名为prefix的字符串,其值为&#34;&#34;,以及一个名为&#39; levels&#39;其值为5.然后,该函数使用新值调用recursivePrint(),因此分配新内存,第一次调用将等待此新调用完成。

这个新调用有一个名为prefix的字符串,值为(char)34+"",级别值为4.注意,这些是这些变量与第一个函数调用完全独立的实例,因为记住:每个函数呼叫拥有它自己的记忆(第一个呼叫正在等待这个呼叫完成)。现在,第二个调用会对recursivePrint()函数进行另一次调用,使更多内存,并等待此新调用完成。

当我们达到等级== 1时,前一次调用会产生一个前缀,剩下的就是使用该前缀并打印该前缀的所有不同组合以及最后一个字符的更改。

递归方法通常效率很低,特别是在这种情况下。

为什么你永远不应该使用它

这种方法不仅效率低下;任何有用的东西都是不可行的。让我们做一个计算:一个包含5个字符的字符串有多少种不同的可能性?那么你想要选择127-33 = 94个不同的字符,那就意味着每个字符有94个选择。然后可能性的总数是94 ^ 5 = 7.34 * 10 ^ 9 [不包括存储每一个的5+字节](从视角来说4GB的RAM大约是4 * 10 ^ 9字节)