首页 > 代码库 > 尾递归
尾递归
尾递归是把递归的一部分放到当层求解, 以缓解递归的栈压力, 我用快排举例说明:
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)。
尾递归就是上面所述的那种形式
它可以很容易的转化成非递归的循环形式
可以不用使用储存栈
当然,如果是非尾递归的形式
转化成普通的循环形式话就需要自己来模拟函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。