繁体   English   中英

递归方法java的问题

[英]Trouble with recursive method java

基本上,我有一个蛮力密码猜测器(我意识到这不是很有效),我有一个过程要做成递归方法,我可以传递一个长度整数,并且它将以该数量的字符运行。 这是代码:

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);
            }
        }


    }

}

interval返回具有该长度示例的字符串:3rd interval将返回长度为3的每个可能的字符串组合。如果有人可以帮助我使此过程自动化并进行解释(我想学习而不是复制和粘贴),那会很棒! :)

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

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

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)

希望这可以帮助!

这是您使用递归实现的方法:

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);
        }
    }

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

希望能帮助到你。

功能

请注意,这将是极其无效的。 这实际上不应该做,因为创建的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的字符串,其值为“”,以及一个名为'levels'的整数,其值为5。然后,该函数使用新值调用recursivePrint(),因此新的内存为已分配,则第一个呼叫将等待,直到此新呼叫结束。

这个新调用具有一个称为String的String,其前缀为(char)34+"" ,而一个级别的值为4。请注意,对于第一个函数调用,这些变量是这些变量的完全独立的实例,因为请记住:每个函数调用有它自己的内存(第一个调用正在等待该调用完成)。 现在,第二个调用再次调用recursivePrint()函数,从而增加了内存,并等待该新调用完成。

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

递归方法通常效率很高,尤其是在这种情况下。

为什么不应该使用它

但是,这种方法不仅效率低下,而且效率很高。 任何有用的东西都是不可行的。 让我们做一个计算:一个5个字符的字符串有多少种不同的可能性? 好吧,您要选择127-33 = 94个不同的字符,这意味着每个字符有94个选择。 然后,可能性总数为94 ^ 5 = 7.34 * 10 ^ 9 [这不包括5个以上的字节来存储每个字节](将其视为4GB RAM大约为4 * 10 ^ 9字节)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM