理解java中的递归而不使用迭代(循环等)

时间:2015-05-01 11:52:24

标签: java

晚上好, 我正在尝试通过这个简单的例子来理解递归

public class exM {

    public static void main(String[] args) {
        System.out.print(myMethod(0)); // change the power to 1,2,3,4
    }

    public static String myMethod(int n){
        if (n==0){
            return "*";
        }
        else {
            return myMethod(n-1) + myMethod(n-1);
        }
    }
}

现在显而易见的是,如果使用0,它将直接转到*打印出来。 接下来,使用1。我可以理解这是转到其他地方并回到我们的方法0并打印出“*”+“*”我们得到“**”。

我无法理解的是,为什么当我们将功率改为2时,它会带回4个星号而不是2个。

有人可以向我解释这是怎么发生的吗?

提前谢谢

6 个答案:

答案 0 :(得分:3)

因为您使用n-1调用该函数,对于每次调用,在2的情况下为1。您将该函数调用两次,因此您将进行两次递归,每次递增值为1。由于1!= 0,2次递归再次在2次递归中溢出,这次是值0,因为这是你的停止条件,它将打印这些4个星号。

所以基本上

                             myMethod(2)
                        /                  \
               myMethod(1)                  myMethod(1)
               /         \                 /         \
     myMethod(0)       myMethod(0)  myMethod(0)      myMethod(0)
         *                 *            *                *

答案 1 :(得分:3)

如果你写出递归,你就会明白了。

myMethod(0) = *

myMethod(1) = myMethod(0) + myMethod(0) = * + * = **

所以对于myMethod(2):

myMethod(2) = myMethod(1) + myMethod(1) = myMethod(0) + myMethod(0) + myMethod(0) + myMethod(0) = ****

答案 2 :(得分:1)

让我们一步一步。

  1. 您输入2.
  2. 2 != 0所以转到else
  3. 现在它将返回myMethod(1) + myMethod(1)
  4. 现在,如果您单步进入myMethod(1),则会返回**
  5. ** + ** = ****

答案 3 :(得分:1)

我建议你用铅笔和纸来分析n = 0,n = 1,n = 2的时间。

通过这种递归,您将实现程序正在创建的树。

如果n = 0您有一个' *'。

如果n = 1你用n = 0调用两次方法 - >> 2x' *' - > ' **'

如果n = 2您使用n = 1调用两次方法 - >> 2x(2x' *') - > ' ****'

如果你想要那个' *'是n代码的值:

public static String myMethod(int n){
    if (n==0){
        return "*";
    }
    else {
        return myMethod(n-1) + '*'; //One '*' more for each call.
    }
}

答案 4 :(得分:0)

使用此功能,如果从0开始将n增加1,您将得到以下行:1,2,4,8,16 ...... 这是因为每次n!= 0时,每次n大于0

时都会执行2x函数

答案 5 :(得分:-1)

我认为这很简单。

当您传入2时,它将返回

 myMethod(1) + myMethod(1)

转换为** + ** ...