一、递归
n不能为0,否则会一直递归却没有递归结束条件,导致堆栈溢出异常
int类型能表示的最大正整数值为2,147,483,647(2的31次方-1),所以输入的正整数值应该不大于30,否则会超出int的数值范围
代码:
public static int calculate(int n) throws IllegalArgumentException{
if(n<0||n>30)
throw new IllegalArgumentException("n的值在[0,31)之间");
if(n==0)
return 1;
else
return 2*calculate(n-1);
}
二、位运算
同样需要规范n的取值范围
public static int calculate2(int n)throws IllegalArgumentException{
if(n<0||n>30)
throw new IllegalArgumentException("n的值在[0,31)之间");
return 1<<n;
}
原理分析
在java中,int类型的1占用4byte、32bit,包括最前面的一个符号位
二进制表示为
0000 0000 0000 0000 0000 0000 0000 0001
1<<2,左移2位
22=4
0000 0000 0000 0000 0000 0000 0000 0100
边界情况,1<<30,左移30位
210=1,073,741,824
0100 0000 0000 0000 0000 0000 0000 0000
觉得本篇对您有帮助的,请留下一个大大的👍🏼赞,这对我真的很重要!