JAVA:有人可以向我解释这个递归代码吗?

时间:2014-04-16 02:34:47

标签: recursion

我在这里有一些针对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,我也不确定为什么会这样。是因为递归调用中的堆栈溢出还是什么?

解释非常有用,谢谢!

5 个答案:

答案 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