我在这里有一些针对Java的练习题。我们应该在不使用编译器的情况下确定答案。
请参阅以下方法:
public static int product(int n){
if (n <= 1)
return 1;
else
return n * product(n-2);
}
调用product(6)时的输出是什么?
A)1
B)8
C)12
D)48
E)70
根据答案,正确的输出是48.我真的不明白为什么这是真的。 6不符合基本情况,因此它转到else语句。 那么6,然后产品(6-2)=产品(4),转到产品(2),转到产品(0) 所以产生6 * 4,4 * 2,2 * 0,0 * 0.但那是32,而不是48?我有什么遗失的吗?
产品(25)由于某种原因返回-1181211311,我也不确定为什么会这样。是因为递归调用中的堆栈溢出还是什么?
解释非常有用,谢谢!
答案 0 :(得分:6)
我刚才在javascript中回答了同样的问题:Need help understanding recursive function example from Eloquent Javascript
基本上它是一个堆栈,但它更容易被认为是一个数学方程式:
n = 6 * product(4)
n = 6 * 4 *产品(2)
n = 6 * 4 * 2 *乘积(0)
n = 6 * 4 * 2 * 1
n = 48
25抛出一个巨大的负数,因为它比int的最大值大..
答案 1 :(得分:3)
代码的工作原理如下:
Round 1 : n = 6 so expression to be evaluated is 6 * product(4).
Round 2 : n = 4 so expression to be evaluated is 6 * 4 * product(2).
Round 3 : n = 2 so expression to be evaluated is 6 * 4 * 2 * product(0).
从0&lt; 1,到达基本案例,product(0) = 1
。因此,最终表达式为6*4*2*1
,等于48。
如果您为25执行此操作,该值将溢出int
的容量,因此您应更改为long
。
答案 2 :(得分:2)
您的代码只是将数字从n乘以1,递减2。
product(25)
应返回7905853580625.由于它不适合int,因此您的方法将导致溢出。
答案 3 :(得分:1)
首先,product(0)
返回1
因为它符合<= 1
的条件,所以链看起来像这样:
6 * product(4), 4 * product(2), 2 * product(0), 1
=&gt; 6 * 8, 4 * 2, 2 * 1
所以,6 * 8 = 48
其次,
product(25)
是整数溢出。您可以在int
中存储的最大值为2,147,483,647(此处说明为max value of integer),而您编写的product()
函数将产生7,905,853,580,625,远大于该最大值。< / p>
答案 4 :(得分:1)
据我所知,答案是正确的。你错过了2永远不会乘以0的要点。在产品(2)之后,将返回1。当一个方法调用自身时,新的局部变量和参数存储在堆栈中,方法代码将从一开始就使用这些新变量执行。
当产品(6)被称为
时1.返回6 *产品(6-2)
产物(4)
2.返回4 *产品(4-2)
产物(2)
3.返回2 *产品(2-2)
产物(0)
4.满足if条件,返回1
因此,6 * 4 * 2 = 48