你如何工作递归?

时间:2015-04-20 11:17:38

标签: java recursion

我收到了以下问题:

考虑以下方法。如果n == 3,它应该返回什么?

public static String recEx(int n) {
    if (n <= 0)
       return "";
    return recEx(n - 3) + n + recEx(n - 2) + n;
}

答案是3113.你如何以及如何实现这个答案?

6 个答案:

答案 0 :(得分:3)

只需在方法的顶部放置System.out.println(n),您就会看到。

recEx(3) calls 
recEx(0)+3+recEx(1)+3
where recEx(1) is
""+1+""+1 

答案 1 :(得分:1)

最好的方法是使用铅笔和纸张开始画画。

                 _recEx(3)_
                /          \
               /          recEx(1)
             recEx(0)     /       \
             /         recEx(-2)  recEx(-1)
            ""

当值为<= 0时,返回一个空字符串,该值被推回给调用者......这就是递归!最好从较小的示例开始,比如n = 2,甚至n = 1,尝试理解它,然后将其应用于更大的数字。

一个好的做法是调试代码并仔细跟踪调试器,一步一步地查看所有值并尝试理解它们。

答案 2 :(得分:1)

recEx(3) = recEx(0) + 3 + recEx(1) + 3
recEx(0) = ""
recEx(1) = recEx(-2) + 1 + recEx(-1) + 1
recEx(-2) = ""
recEx(-1) = ""

所以答案是:

recEx(3) = recEx(0) + 3 + recEx(1) + 3
recEx(3) = "" + 3 + recEx(-2) + 1 + recEx(-1) + 1 + 3
recEx(3) = "" + 3 + "" + 1 + "" + 1 + 3
recEx(3) = "3113"

答案 3 :(得分:1)

从基本案例开始:n <= 0

recEx(0) ; ==> ""

当您查看默认情况时,它将始终在每次递归时减少n。因此,你应该尝试n == 1并使用当n <= 0时可以用&#34;&#34;替换的知识。

recEx(1);                       ==> 
recEx(-2) + 1 + recEx(-1) + 1;  ==> 
"" + 1 + "" + 1;                ==>
"11"

然后尝试n == 2

recEx(2);                       ==> 
recEx(-1) + 2 + recEx(0) + 2;   ==>
"" + 2 + "" + 2;                ==>
"22"

然后你尝试n == 3。在这里,您可以使用recEc(1)

的先前知识
recEx(3);                       ==> 
recEx(0) + 3 + recEx(1) + 3;    ==>
"" + 3 + "11" + 3;              ==>
"3113"

你去了......正如你所看到的,我从最简单的方向走后去。我使用替换规则说你可以用方法调用替换已知结果的结果。只要该方法具有功能性(不依赖于参数以外的其他东西),您就可以做到这一点。

有趣的是什么recEx(5)?那一定是这样的:

recEx(5);                       ==> 
recEx(2) + 5 + recEx(3) + 5;    ==>
"22" + 5 + "3113" + 5           ==>
"22531135"

当您已经知道recEx(2)recEx(3)的答案时,这很简单。

从默认情况开始计算recEx(3)的工作方式相同,只是您需要停止在每个级别执行的操作以计算递归调用的结果。请记住跟踪您计算的n及其结果,这样您就不需要像计算机实际执行的那样多次n

我发现这样做的方式更容易,因为你不需要在同一时间做几件事。

答案 4 :(得分:0)

使用以下代码调用您的方法:

System.out.println(recEx(3));

来自Your Output

  

3113

答案 5 :(得分:0)

你必须追踪它:

当n = 3时

将再次致电:

recEx(0) + 3 + recEc(1) + 3

recEx(0)  // will return empty string

如果你要求recEx(1)     recEx(-2)+ 1 + recEx(-1)+ 1

recEx(-2)   // will return empty string
recEx(-1)   // will return empty string

所以首先会重新计算

 recEx(-2)  + 1 + recEx(-1) + 1 = "" + 1 + "" + 1  = "11"

并且此结果将返回第一个调用者

     recEx(0) + 3 + recEc(1) + 3 = "" + 3 + "11" + 3 = "3113"

并将结果打印到控制台:

System.out.println(recEx(3));