如何在没有其他情况下解决此Java递归问题?

时间:2017-01-15 01:15:50

标签: java if-statement recursion case base

public void doSomething(int n){
     if (n > 0){
          doSomething(n-1);
          System.out.print(n);
          doSomething(n-1);
     }
}

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

3 个答案:

答案 0 :(得分:2)

递归并不需要base个案例。它只需要两件事:

  1. 程序可以终止的一点(在这种情况下为i == 0
  2. 每个递归调用都在接近该点的方向上运行(在这种情况下为doSomething(n - 1)而不是doSomething(n + 1)
  3. 如果您希望以base的方式进行思考,那么您的代码与以下内容完全相同:

    public void doSomething(int n){
         if (n <= 0) {
             return;
         }
    
         doSomething(n-1);
         System.out.print(n);
         doSomething(n-1);
    }
    

    如果您感兴趣,您的代码逻辑类似于二叉树inorder traversal的递归版本。您可以参考https://en.wikipedia.org/wiki/Tree_traversal#In-order获取更多见解。

答案 1 :(得分:0)

  

如果n == 0,该函数会起什么作用?

绝对没有。

  

这是如何进行递归步骤的?

它没有继续。

不应该继续。当n <= 0代码不再进一步递归时。

有人建议您使用调试器运行代码,以帮助您可视化正在进行的操作。这也应该有助于解决这个概念问题:

  

我无法遵循递归过程,因为只有基本案例且没有else案例。

你误解了递归的基础知识。它不需要else个案。 实际上需要什么是一种停止递归的方法。 else案例是一种可能性,但还有其他一种情况。

或者......将它带回到你的例子......你的代码等同于:

public void doSomething(int n){
     if (n > 0){
          doSomething(n-1);
          System.out.print(n);
          doSomething(n-1);
     } else {
          // this is a comment
     }
}

现在有else个案例......这是一个空块。或者您可以将冗余的return语句放入块中。 (我假设你可以弄明白为什么它是多余的!)

答案 2 :(得分:0)

我认为这段代码是递归的一个很好的例子。 它会生成01以及5长度递归的所有组合,结果模式为:

结果:

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();
     }
}

它的工作原理如下:

例如,长度为2 * 2 = 4种组合。

是:

00
01
10
11

但它是如何产生的呢?

它的工作原理如下:

第一次调用:执行循环(0)。

循环实际上是i=0。它把它写下来。字符串是"0"。现在它启动loop(1)。这个函数最初有i=0,添加它,现在字符串是"00",它注意到它已经是第二个循环,所以它会打印它但不会再次启动该函数。打印出"00"。现在循环更进一步。i=1。首先它试图切断所有字符,直到现在,所以"00"中只有第一个零,所以它是"0"。现在附加"1",字符串为"01"。它注意到它已经是第二个循环,因此它会打印它但不会再次启动该功能。打印"01"。这个功能一直在继续,所以它又回到了第一个功能。那里的循环现在进一步运行,它试图切断所有字符,直到现在,所以现在我们有一个清除的字符串""。它启动loop(1)。此函数首先有i=0,将其添加到字符串,现在字符串为"10",它注意到它已经是第二个循环,因此它会打印它但不会再次启动该功能。打印出"10"。现在循环更进一步。 i=1。首先它试图切断所有字符,直到现在,所以"10"之外只有第一个字符,所以它是"1"。现在附加"1",字符串为"11"。它注意到它已经是第二个循环,因此它会打印它但不会再次启动该功能。打印"11"。没有进程在运行。