首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAVA:有人能给我解释一下这个递归代码吗?

JAVA:有人能给我解释一下这个递归代码吗?
EN

Stack Overflow用户
提问于 2014-04-16 02:34:47
回答 5查看 614关注 0票数 1

我这里有一些Java的练习问题。我们应该不使用编译器来确定答案。

请参考以下方法:

代码语言:javascript
复制
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,我也不知道为什么会这样。是因为递归调用中存在堆栈溢出之类的原因吗?

解释会非常有帮助的,谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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的最大值。

票数 6
EN

Stack Overflow用户

发布于 2014-04-16 02:41:36

代码的工作方式如下:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2014-04-16 02:41:26

您的代码只是将数字从n乘成1,然后递减2。

product(25)应该返回7905853580625。由于它不适合int,所以您的方法将导致溢出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23097998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档