在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 Whenstr.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 + ".");
}