public static int exponent(int baseNum, int exp) {
if (exp == 0) return 1;
else return baseNum * exponent(baseNum, --exp);
}
我不明白这两个参数在这个递归方法中是如何工作的。是否将basenum值转换为指数乘以basenum然后返回?然后第二个参数(exp)执行相同的操作,直到它到达基本情况?如果你能帮助我想象或分解这是如何工作,那太好了!谢谢您。
4条答案
按热度按时间t1qtbnec1#
下面是一个使用2和4作为参数()的递归方法调用示例:
指数(2,4)
=>2指数(2,3)
=>2指数(2,2)
=>2指数(2,1)
=>2exponent(2,0)<-exp==0,返回1,因此不再递归调用
所以在链条的后面工作:
2 * (1) => 2
2 * (2) => 4
2 * (4) => 8
2 * (8) => 16
这个特殊方法的一个问题是,如果在第一次调用时为exp传递负值,则会得到无限递归。最好检查(exp<=0)
sf6xfgos2#
递归方法
exponent()
如果第二个参数exp
不是0,并在进一步计算中使用返回的结果。每次通话,exp
减少1,所以最后(如果最初>0)它满足终端条件。一个简单的序列图来说明:
xwbd5t1u3#
当你第一次调用这个方法时,比如说指数(10,5),这意味着递归方法被调用了5次。
每次exp在调用递归方法之前减少1。参数被传递到方法中。它们是局部变量,所以它们只存在于方法内部。
指数(10,5)将调用
else return 10 * exponent(10,4)
然后else return 10 * exponent(10,3)
然后else return 10 * exponent(10,2)
…等等直到exp==0。
n9vozmp44#
exponent()
是一种计算数字的方法(baseNum
)另一个数字的力量(exp
)只需将数字与自身相乘exp
次数。如果指数为
0
,然后它将返回1
因为每一个0次方的整数都等于1(除了0本身,因为某些原因它没有被覆盖)。假设我们要计算
2^3
. 我们将通过编写exponent(2,3)
. 发生的情况如下:return 2*exponent(2,2);
自exponent(2,2)
是同一件事return 2*exponent(2,1);
,我们可以这样写:return 22exponent(2,1);
exponent(2,1)
是同一件事2*exponent(2,0)
哪个是2*1
(何时exp
是0
,我们回来1
). 所以我们可以把它写成return 2*2*2*1
;所以我们想计算
2^3
这个方法自己调用了三次2
每次都带着自己的答案终于回到了2*2*2*1
.别忘了
0^0
不是1
. 如果你打电话exponent(0,0)
你会得到1
这是错误的。