在没有else的情况下,如何解决这个Java递归?
如果我写:doSomething(3),终端将打印1213121,但我无法遵循递归过程,因为只有一个基本情况,没有其他情况。如果n==0,函数做什么?那该如何进行递归步骤呢?递归不需要有在没有else的情况下,如何解决这个Java递归?,java,if-statement,recursion,case,base,Java,If Statement,Recursion,Case,Base,如果我写:doSomething(3),终端将打印1213121,但我无法遵循递归过程,因为只有一个基本情况,没有其他情况。如果n==0,函数做什么?那该如何进行递归步骤呢?递归不需要有basecase。它只需要两件事: 程序可以终止的点(i==0) 每个递归调用在接近该点的方向上运行(doSomething(n-1)在本例中,不是doSomething(n+1)) 如果您更喜欢以base案例的方式思考,那么您的代码与以下代码完全相同: public void doSomething(int n
base
case。它只需要两件事:
i==0
)doSomething(n-1)
在本例中,不是doSomething(n+1)
)base
案例的方式思考,那么您的代码与以下代码完全相同:
public void doSomething(int n){
if (n > 0){
doSomething(n-1);
System.out.print(n);
doSomething(n-1);
}
}
public void doSomething(int n){
如果(n)
如果n==0,函数做什么
绝对没有
这是如何进行递归步骤的
它无法继续
当n时,我认为这段代码是递归的好例子。
它生成具有0
和1
和长度5
递归的所有组合,模式结果为:
结果:
public void doSomething(int n){
if (n > 0){
doSomething(n-1);
System.out.print(n);
doSomething(n-1);
} else {
// this is a comment
}
}
代码:
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111
但它是如何产生的呢
它的工作原理是:
第一次调用:执行循环(0)
循环实际上有i=0
。它将它写下来。字符串是“0”
。现在它启动循环(1)
。这个函数首先有i=0
,然后添加它,现在字符串是“00”
,它注意到它已经是第二个循环,因此它会打印它,但不会再次启动该函数。“00”
被打印出来。现在循环更进一步。i=1
。首先它尝试剪切所有字符,直到现在,所以在“00”
中,只保留第一个零,所以它的“0”
。现在添加“1”
,字符串是“01”
。它注意到它已经是第二个循环了,所以它会打印它,但不会再次启动该函数。“01”
被打印。该函数已继续,因此它会返回到第一个函数。该循环现在运行得更远,它会尝试剪切所有字符,直到现在,所以现在我们有了一个清除的字符串”
。它启动循环(1)
。此函数首先具有i=0
,将其添加到字符串中,现在字符串是“10”
,它注意到它已经是第二个循环,因此它会打印它,但不会再次启动该函数。“10”
被打印出来。现在循环更进一步。i=1
。首先它尝试剪切所有字符,直到现在,所以在“10”
中只保留第一个字符,所以它的“1”
被追加。现在“1”
被追加,字符串是“11”
。它注意到它已经是第二个循环了,因此它确实打印了它,但没有再次启动该函数。“11”
已打印。不再运行任何进程。如果n基本情况是n==0,递归情况是n>1。我不确定你在问什么。我不确定你想要实现什么。当n==0时,它什么也不做,它会返回。当n==0时,你希望它做什么?你也调用doSomething()在同一个循环中进行两次并没有错,但看起来很奇怪。试着一步一步地调试并遵循执行路径。我想你会明白的。
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111
class Stringhelper {
public Stringhelper() {
}
public String getstring(String string,int beginning,int ending) {
if (string.length() != 0) {
String newstring="";
for (int iter=Math.abs(beginning); iter < ending && iter < string.length(); iter=iter+1) {
newstring=newstring+Character.toString(string.charAt(iter));
}
return newstring;
}
else {
return "";
}
}
}
public class Counter {
public String abil=""; //Possible Combinations
public int iter=0;
public Stringhelper shelper=new Stringhelper();
public void loop(int iter) {
for (int i=0; i < 2; i++) {
abil=shelper.getstring(abil,0,iter); //Crop everything until this char, if string was 010, for and iter is 2 : 01+result of this loop
abil=abil+Integer.toString(i);
if (iter==4) { //0,1,2,3,4=Length 5
System.out.println(abil);
}
else {
loop(iter+1);
}
}
}
public Counter() {
loop(iter);
}
public static void main(String args[]){
new Counter();
}
}
00
01
10
11