Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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
在没有else的情况下,如何解决这个Java递归?_Java_If Statement_Recursion_Case_Base - Fatal编程技术网

在没有else的情况下,如何解决这个Java递归?

在没有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

如果我写:doSomething(3),终端将打印1213121,但我无法遵循递归过程,因为只有一个基本情况,没有其他情况。如果n==0,函数做什么?那该如何进行递归步骤呢?

递归不需要有
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