Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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
Java 如何计算递归?_Java_Recursion - Fatal编程技术网

Java 如何计算递归?

Java 如何计算递归?,java,recursion,Java,Recursion,有人向我提出以下问题: 考虑以下方法。如果n==3,它应该返回什么 public static String recEx(int n) { if (n <= 0) return ""; return recEx(n - 3) + n + recEx(n - 2) + n; } 公共静态字符串recEx(int n){ 如果(n只需在方法顶部放置一个System.out.println(n),您将看到 recEx(3) calls recEx(0)+3+re

有人向我提出以下问题:

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

public static String recEx(int n) {
    if (n <= 0)
       return "";
    return recEx(n - 3) + n + recEx(n - 2) + n;
}
公共静态字符串recEx(int n){

如果(n只需在方法顶部放置一个
System.out.println(n)
,您将看到

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

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

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

在调用方法时使用以下代码:

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

3113


在调用方法时使用以下代码:

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

3113

您必须跟踪它:

当n=3时 将再次呼吁:

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

recEx(0)  // will return empty string
如果您需要recEx(1) 收益(-2)+1+收益(-1)+1

所以首先要重新计算

 recEx(-2)  + 1 + recEx(-1) + 1 = "" + 1 + "" + 1  = "11"
这个结果将返回给第一个调用者

     recEx(0) + 3 + recEc(1) + 3 = "" + 3 + "11" + 3 = "3113"
并将结果打印到控制台:

System.out.println(recEx(3));   
您必须跟踪它:

当n=3时 将再次呼吁:

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

recEx(0)  // will return empty string
如果您需要recEx(1) 收益(-2)+1+收益(-1)+1

所以首先要重新计算

 recEx(-2)  + 1 + recEx(-1) + 1 = "" + 1 + "" + 1  = "11"
这个结果将返回给第一个调用者

     recEx(0) + 3 + recEc(1) + 3 = "" + 3 + "11" + 3 = "3113"
并将结果打印到控制台:

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

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

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

当值为
时,最好的方法是用铅笔和纸开始画画

                 _recEx(3)_
                /          \
               /          recEx(1)
             recEx(0)     /       \
             /         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"
所以答案是:

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"

从基本情况开始:
n“”
当您查看默认情况时,每次递归都会减少
n
收益(-2)+1+收益(-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);==>
收益(2)+5+收益(3)+5;=>
"22" + 5 + "3113" + 5           ==>
"22531135"
如果您已经知道
recEx(2)
recEx(3)
的答案,那么这就非常简单了

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


我发现用我在这里介绍的方法做这件事要容易得多,因为你不需要同时做几件事。

从基本情况开始:
n“”
当您查看默认情况时,每次递归都会减少
n
收益(-2)+1+收益(-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);==>
收益(2)+5+收益(3)+5;=>
"22" + 5 + "3113" + 5           ==>
"22531135"
如果您已经知道
recEx(2)
recEx(3)
的答案,那么这就非常简单了

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


我发现用我在这里介绍的方法做这件事要容易得多,因为你不需要同时做几件事。

可能会有帮助:p对于如此少量的调用,使用纸笔方法,绘制方法调用图。可能会有帮助:p对于如此少量的调用,使用纸笔方法,绘制方法调用图。