码迷,mamicode.com
首页 > 其他好文 > 详细

尾递归

时间:2014-07-22 08:25:36      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:java   使用   io   art   re   c   

尾递归是把递归的一部分放到当层求解, 以缓解递归的栈压力, 我用快排举例说明:
1: 普通快排
void qsort(int *ar, int l, int r){

if(l>=r) return ;
int mid = partion(ar, l ,r);
qsort(ar, l, mid); 
qsort(ar, mid+1, r);

}
当求解序列已排序的时候, 由于每次只能分出一个数, 所以栈深达到了O(N);
2:尾递归
void qsort(int *ar, int l, int r){

while(l < r-1){
    int mid = partion(ar, l, r);
    qsort(ar, l, mid); l=mid;
}

}
吧一部分求解留在本层, 这样可以降低栈压力, 但是栈深还是O(N);
3:真正理解后的尾递归
void qsort(int *ar, int l, int r){

while(l < r-1){
    int mid = partion(ar, l, r);
    if(mid - l < r - mid){
        qsort(ar, l, mid); l=mid;
    }
    else {
        qsort(ar, mid, r); r=mid;
    }
}

}
把小部分递归, 剩余部分本层处理, 极大地提升速度的同时, 是栈深不超过O(LGN)。

尾递归就是上面所述的那种形式
它可以很容易的转化成非递归的循环形式
可以不用使用储存栈
当然,如果是非尾递归的形式
转化成普通的循环形式话就需要自己来模拟函数

尾递归,布布扣,bubuko.com

尾递归

标签:java   使用   io   art   re   c   

原文地址:http://my.oschina.net/u/932809/blog/289268

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!