首页 > 代码库 > 尾递归

尾递归

尾递归是把递归的一部分放到当层求解, 以缓解递归的栈压力, 我用快排举例说明:
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)。

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