Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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_Recursion - Fatal编程技术网

在Java中创建递归

在Java中创建递归,java,recursion,Java,Recursion,起初,这似乎是一个不需要动脑筋的问题,但我越是尝试这样做,我就越是陷入困境 我希望创建一个递归方法,该方法将采用字符串和带点的输出组合,如下所示: 输入:测试 输出: test t.est te.st tes.t t.es.t te.s.t t.e.s.t t.e.st 你明白了。。。我需要所有字符之间的点排列。但两个点不应该同时出现,点不应该是第一个或最后一个字符 我写的代码是: public final class Main{ public static void main(Stri

起初,这似乎是一个不需要动脑筋的问题,但我越是尝试这样做,我就越是陷入困境

我希望创建一个递归方法,该方法将采用字符串和带点的输出组合,如下所示:

输入:测试

输出:

test
t.est
te.st
tes.t
t.es.t
te.s.t
t.e.s.t
t.e.st
你明白了。。。我需要所有字符之间的点排列。但两个点不应该同时出现,点不应该是第一个或最后一个字符

我写的代码是:

public final class Main{
   public static void main(String[] args) throws Exception{
      recurse ("test");
   }

   public static void recurse(String str){
        recurse("",str);
   }

   public static void recurse (String pre, String str){
      if(str.length() > 1){
         recurse(pre+str.substring(0,1)+".",str.substring(1));
      }
      System.out.println(pre+str);  
   }
}
但是,我的头脑无法控制它。我应该做什么改变


为了澄清起见,我从中得到了这个想法,但我无意对invite系统进行黑客攻击。

您可以使用以下代码:

public static void recurse (String pre, String str){
    if(str.length() > 1) {
        String str1 = pre + str.substring(0,1) + ".";
        String str2 = str.substring(1);
        System.out.println(pre + str);
        recurse(str1, str2);
    }
    System.out.println(pre + str);
}
输出:

test
t.est
t.e.st
t.e.s.t
t.e.st
t.est
test
.tes
.t.es
.t.e.s
.t.e.s.
.t.es.
.te.s
.te.s.
.tes.

您需要在循环中递归以获得所有可能性

public static void recurse(String pre, String str) {
    pre += ".";
    System.out.println(pre + str);
    for (int i = 1; i <= str.length(); i++)
        recurse(pre + str.substring(0, i), str.substring(i));
}

注意:您可能需要稍加修改,以避免在开头包含

我会将字符串中的位置传递给递归函数:

public static void recurse(String str) {
    recurse(str, 1); // start only at 1 since we do not want dot at first position
}

public static void recurse(String str, int n) {
    if (n >= str.length()) { // >= since no dot at last position
        System.out.println(str); // ok we have a full string : print it
    } else {
        recurse(str, n + 1);    // either not dot and recurse
        str = str.substring(0, n) + "." + str.substring(n); // or add one at n
        recurse(str, n + 2);   // and recurse too
    }
}
recurse(“test”)
的输出与预期一致:

test
tes.t
te.st
te.s.t
t.est
t.es.t
t.e.st
t.e.s.t

我猜您希望通过从
str
中提取第一个字符,为每个递归调用向
pre
添加一个新字符,因此当
str
中只剩下一个字符时,应该停止

public static void recurse(String pre, String str) {
    if (str.length() == 1) {
        System.out.println(pre + str);
        System.out.println(pre + " ." + str);
        return;
    }

    recurse(pre + str.substring(0, 1), str.substring(1));
    if (pre.length() > 0)
        recurse(pre + "." + str.substring(0, 1), str.substring(1));
}
用递归(“,“test”)调用它为您提供:

test
tes .t
te.st
te.s .t
t.est
t.es .t
t.e.st
t.e.s .t
试一试

如果允许
在整个字符串前面,请使用:

String s = "test";
recurse("",s);
如果不允许
在前面:

recurse(s.charAt(0), s.substring(1));
如果允许添加
(即
测试
t.e.s.t.
),请将If块更改为

if (next.length() == 0) {
    System.out.println(prev);
    System.out.println(prev + ".");
}

@ka4eli When
str.length()是否要作为
oneplus2
invite hack的一部分执行此操作:PHehe,@ReservoirSampling,我确实是从《媒体》的帖子中得到这个想法的,但我无意购买OnePlus 2,也无意入侵它的邀请系统(不会用10英尺长的电线杆碰那部手机)。我只是想在java中做同样的字符串操作,就像我说的那样,作为一种消磨时间的方式,这似乎是一种不费吹灰之力的做法,然后我就被卡住了(正如您在输出和代码中看到的,您将每个字符串打印两次。这可能不是OP想要的。使用所需的输出更新了问题。基本上,我想要两个字符串之间的所有点排列。)characters@inquizitive,我不明白你的意思algorithm@inquizitive,
te.s.t
->
t.e.s.t
->
t.e.st
Exp请告诉我这个序列问题中没有序列,我只是尝试用
test
显示所有可能的组合。序列并不重要。这不会被无限次地调用
recurse()
?每个循环的开始调用
recurse()
,它启动另一个调用
recurse()的循环
等等,直到计算机抱怨堆栈中的函数太多。这个问题的递归性质意味着您不需要循环,或者至少不需要一个调用其中函数却无法逃逸的循环。谢谢,这是可行的,而且您可能有最接近我所寻找的答案,因为我想知道w需要将hat添加到我已经编写的代码中。哦..并且我添加了
if(!pre.isEmpty())pre+=”
对于初始点!@Will,循环中的条件将停止无限递归。非常感谢您的回答,这非常有效。实际上,我想知道的是我的方法中有什么错误。这可以通过多种方式完成,但我选择了一种,但我无法用它完成这件事,因此我有兴趣知道我的代码缺少了什么!非常感谢您的回答。这是我所期望的代码。但是我错过了第二个递归调用。
if (next.length() == 0) {
    System.out.println(prev);
    System.out.println(prev + ".");
}