今天使用递归调用计算的时候发现一个很奇怪的问题
代码:
public class practice20 {
public static double nStep(double N) {
if (N<=0) {
return 1;
}
System.out.print(N+"*"); // -----------------------------------------@1
return N*nStep(N-1);
}
public static void main(String[] args) {
for (int i = 1; i < 5; i++) {
System.out.print("ln("+i+"!)="+Math.log(nStep(i))); //-------@2
System.out.println();
}
}
}
结果:
1.0*ln(1!)=0.0
2.0*1.0*ln(2!)=0.6931471805599453
3.0*2.0*1.0*ln(3!)=1.791759469228055
4.0*3.0*2.0*1.0*ln(4!)=3.1780538303479458
可以看到@1语句的阶乘语句执行居然比@2语句的拼接快
结果分析:
@3 @4 @5
在执行System.out.print("ln("+i+"!)="+Math.log(nStep(i))); 的时候是
先执行函数的,然后获取函数值然后在执行拼接,最后执行输出
执行顺序为@5 => @1 => @4 => @4 =>@3