Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找所有长度的字符串_Java_String_Recursion - Fatal编程技术网

Java 查找所有长度的字符串

Java 查找所有长度的字符串,java,string,recursion,Java,String,Recursion,给定一个包含所有密码的类密码,这些密码只能用英文字母表中的小写字母书写,我想编写一个算法,通过遍历所有可能的相同长度的密码,递归地查找密码 类密码有一个方法public boolean isPassword(String st),它比较给定密码p和字符串st,并返回它们是否相等的布尔值 让我们调用这个方法公共静态字符串findPassword(密码p,int-length) 我的想法是通过两个递归调用来实现这一点——一个调用长度为p,并使用方法charAt(i)在字符串alphabet=“abc

给定一个包含所有密码的类密码,这些密码只能用英文字母表中的小写字母书写,我想编写一个算法,通过遍历所有可能的相同长度的密码,递归地查找密码

类密码有一个方法
public boolean isPassword(String st)
,它比较给定密码p和字符串st,并返回它们是否相等的布尔值

让我们调用这个方法
公共静态字符串findPassword(密码p,int-length)

我的想法是通过两个递归调用来实现这一点——一个调用长度为p,并使用方法
charAt(i)
在字符串
alphabet=“abcd…..z”
上连续添加字母表中的字符,直到它得到一个长度与p(意思是长度)相同的字符串

第二个递归调用将继续对字母表中的字母进行调用,每次将字母添加到前一个字符串中时都会进行更改,从而创建新的字符串。例如,给定一个长度为
L
的字符串
st
,我们将首先添加字母a,然后添加字母b,依此类推,直到到达z,从长度为
L
的字符串移动到长度为
L+1


目前我的问题是将这些想法中的一些转化为代码,我希望这样做时不需要任何for循环

如果您对循环执行简单的
,您将执行以下操作:

// For n=1
for (int i = 0; i < 26; i++)
    System.out.println(alphabet.substring(i, i + 1));

// For n=2
for (int i = 0; i < 26; i++)
    for (int j = 0; j < 26; j++)
        System.out.println(alphabet.substring(i, i + 1) +
                           alphabet.substring(j, j + 1));

// For n=3
for (int i = 0; i < 26; i++)
    for (int j = 0; j < 26; j++)
        for (int k = 0; k < 26; k++)
            System.out.println(alphabet.substring(i, i + 1) +
                               alphabet.substring(j, j + 1) +
                               alphabet.substring(k, k + 1));
现在,由于您不能为
n
的动态值硬编码嵌套循环的数量,所以您可以使用递归,正如您所说的,但是在从
1
n
的过程中,只有一个递归调用

这意味着递归方法需要接收两个参数:到目前为止的字符串和要添加的剩余字母数

在最深的递归调用中,即不再需要添加字母时,打印结果

以下是伪代码:

method(String textSoFar, int lettersLeft) {
    if (lettersLeft == 0)
        print textSoFar
    else
        for each letter in alphabet:
            method(textSoFar + letter, lettersLeft - 1)
}
您可以通过调用
方法(“,n)
来启动递归

请记住,您不能返回字符串,因为您将生成大量字符串以增加
n
的值:

  • 26个字符串,用于
    n=1
  • 676个字符串,用于
    n=2
  • 17576个字符串,用于
    n=3
  • 456976字符串,用于
    n=4
  • n=5的11881376个字符串
  • 而且越来越糟

您应该展示一个示例,其中包含示例输入和预期输出。是的,我同意。我发现要准确理解你的函数应该做什么有点困难。你在标题中也会说“比较”,但在实际问题中却没有。您是否试图生成包含字母表每个排列的长度为n的所有字符串?关于您的编辑,如果您不知道程序将接受什么输入以及它应该输出什么,那么您如何知道您正在做什么以及何时做,因为您不知道应该输出什么?这毫无意义。再想一想;-)示例输出的意思是:例如,当
n=3
时,函数应该返回什么。您会说:“它创建了所有长度为n的字符串,其中包含所描述的字母表”,所以您想输出一组字符串?只有一根绳子?另外,我似乎找不到所描述的
部分你知道你会得到很多输出,对吗?字符串的数量是
26^n
,因此
676
对于
n=2
17576
对于
n=3
456976
对于
n=4
11881376
对于
n=5
,情况会越来越糟。一个问题是,有没有办法在else中改为for循环为递归,如果不使用26种不同的递归,“对于字母表中的每个字母”是一个
for
循环。
method(String textSoFar, int lettersLeft) {
    if (lettersLeft == 0)
        print textSoFar
    else
        for each letter in alphabet:
            method(textSoFar + letter, lettersLeft - 1)
}