Java递归优化

本文探讨了两种递归方式:经典递归和尾递归。经典递归在计算阶乘时使用多个栈帧,导致较大的空间消耗。而尾递归通过在递归调用末尾返回结果,仅使用一个栈帧,降低了空间复杂度。理解并应用尾递归优化可以提高算法效率。
摘要由CSDN通过智能技术生成

一、经典递归

(注:本文例子只用于探讨,不考虑n<=0 等复杂情况。)

int factorial(int n){
    if(n==1){
        return 1;
    }else{
        return n*factorial(n-1);
    }
}

执行过程如下:

factorial(1)= 1
factorial(2)= 2*factorial(1)= 2*1 = 2
factorial(3)= 3*factorial(2)= 3*2 = 6
factorial(4)= 4*factorial(3)= 4*6 = 24
……

结论:这种递归方式实际是利用了大量的栈帧(每个栈帧都是一次函数计算),存放中间值,直到完成递归(递归必须保证有终止条件哦)。由于使用大量栈帧,因此空间消耗是比较大的。

二、尾递归优化

int factorial(int n,int result){
    if(n==1){
        return result;
    }else{
        return factorial(n-1,n*result);
    }
}

执行过程如下:

factorial(4,1)
= factorial(3,4*1)
= factorial(2,3*4*1)
= factorial(1,2*3*4*1)
= factorial(1,24)
= 24

结论:这种递归方式一般称为尾递归,实际只使用了一个栈帧,不停的进行返回值的计算,直到完成递归(递归必须保证有终止条件哦)。尾递归的好处是,复用了栈帧,空间消耗相对较小。

图解递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值