尾递归是把递归的一部分放到当层求解, 以缓解递归的栈压力, 我用快排举例说明:
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)。
尾递归就是上面所述的那种形式
它可以很容易的转化成非递归的循环形式
可以不用使用储存栈
当然,如果是非尾递归的形式
转化成普通的循环形式话就需要自己来模拟函数
原文地址:http://my.oschina.net/u/932809/blog/289268