我收到了以下问题:
考虑以下方法。如果n == 3
,它应该返回什么?
public static String recEx(int n) {
if (n <= 0)
return "";
return recEx(n - 3) + n + recEx(n - 2) + n;
}
答案是3113.你如何以及如何实现这个答案?
答案 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)
答案 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));