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对于如此少量的调用,使用纸笔方法,绘制方法调用图。