尾递归

什么是尾递归。或许我们直接用一般递归和尾递归比较一下,就能了解什么是尾递归了。

尾递归是针对一般递归进行了优化。

我们先说一下,

一般递归:

    public static int f(int n) {  
        if (1 == n)   
            return 1;  
        else   
            return n*(n-1);  
    }  

运行:
f(5)
5*f(4)
5*4*f(3)
5*4*3*f(2)
5*4*3*2*1

一般递归,每一级递归都需要调用函数,每次递归都带有新的变量,所以每次都会创建新的栈,随着递归会深度增加。栈越多的话,会出现爆栈的情况。

接下来说,

尾递归:

    public static int f(int n,int m=1) {  
        if (0== n)   
            return m;  
        else   
            return f(n-1,n*m);  
    } 
稍微修改了一下代码
运行:
f(5,1)
f(4,5*1)
f(3,5*4)
f(2,5*4*3)
f(1,5*4*3*2)
f(0,5*4*3*2*1)
5*4*3*2*1

可以看到每一级递归调用函数都是成线性的形式。每次递归返回的都是相同的函数,没有产生新的变量,这样一来就不需要每级都创建新的栈。就能够避免爆栈的问题。

也就是说 尾递归不压栈,对一般递归进行了优化。

 

有部分文字是参考了该博主的 https://blog.csdn.net/ialexanderi/article/details/81482878

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值