我这里有一些Java的练习问题。我们应该不使用编译器来确定答案。
请参考以下方法:
public static int product(int n){
if (n <= 1)
return 1;
else
return n * product(n-2);
}当产品(6)被调用时,输出是什么?
A) 1
( B) 8
( C) 12
( D) 48
( E) 70
根据答案,正确的输出是48。我真的不明白为什么这是真的。6不符合基本情况,所以它将转到case语句。然后乘积(6-2)=乘积(4),乘积(2),乘积( 0 ),从而产生6 * 4,4* 2,2* 0,0*0。但那是32,而不是48?我遗漏了什么吗?
产品(25)由于某种原因返回-1181211311,我也不知道为什么会这样。是因为递归调用中存在堆栈溢出之类的原因吗?
解释会非常有帮助的,谢谢!
发布于 2014-04-16 02:41:47
我刚才用javascript回答了同样的问题:Need help understanding recursive function example from Eloquent Javascript
基本上它是一个堆栈,但它更容易被看作是一个数学方程:
N=6*乘积(4)
N=6*4*乘积(2)
n= 6*4*2*乘积(0)
N=6*4*2*1
N= 48
25抛出一个巨大的负数,因为它大于int的最大值。
发布于 2014-04-16 02:41:36
代码的工作方式如下:
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< 1,因此达到了基本情况,因此product(0) = 1。因此,最后的表达式是6*4*2*1,它等于48。
如果您这样做25,该值将溢出容量的int,所以您应该更改为long。
发布于 2014-04-16 02:41:26
您的代码只是将数字从n乘成1,然后递减2。
product(25)应该返回7905853580625。由于它不适合int,所以您的方法将导致溢出。
https://stackoverflow.com/questions/23097998
复制相似问题