尾递归优化

  • 今天在看设计模式时提到了尾递归优化,于是去网上搜索了一下,又重新让我认识了递归的另一种方式,由此记录下来.

  • 之前写过一些算法题,相信大部分人在做算法题时都会避开用递归,为什么呢,因为递归的调用会让上一层的方法信息,和一些参数都保存在堆栈中,于是乎如果层数太多,堆栈就会溢出,抛出StackOverflowError这个异常,因为java虚拟机在运行方法时会给每个方法分配一个堆栈空间,方法过多,剩余空间不够了就会抛那个异常;但是尾递归就不太可能会有这个问题,先看一下代码

    拿斐波那契数列举例,普通的递归会这么写:

        public static long recu(int n){
            if (n < 2){
                return n;
            }else {
                return recu(n-1)+recu(n-2);
            }
        }
    

    可以看出方法内部的return会不断保留上一层方法的信息

    再看一下尾递归:

        public static long tailRe(int n, long a, long b){
            if (n == 0){
                return a;
            }else {
                return tailRe(n-1, b,a+b);
            }
        }
    

    尾递归在返回时不会积累上层方法的信息,因为在调用下一层方法时上层方法已经不起作用了,所以可以直接把上层方法去除掉,节省堆栈空间

    比较一下结果:


    尾递归
  • 仔细思考一下,发现尾递归的方式就是要满足在方法返回语句内递归方法是返回语句的末尾,且不能有式子出现,因为这样的话最上层方法需要取得下层方法的结果再来执行本方法,就会产生堆栈空间的大量占用.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.什么是递归? 程序调用自身的编程技巧称为递归( recursion),就好像你做了一个梦,梦里面梦到梦到自己又...
    梦想怪阅读 1,071评论 0 2
  • 以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么。在函数式编程中,随处可见递归思想的运用。下面给出几个递归...
    JasonDing阅读 1,492评论 0 1
  • lua程序设计 书中原文 Lua中函数的另一个有趣的特征是可以正确的处理尾调用(proper tail recur...
    人气小哥阅读 3,917评论 0 0
  • 什么是尾递归 如果一个函数在定义时引用了自身,那么这个函数就是一个递归函数。例如我们所熟知的阶乘就可以通过递归函数...
    Liutos阅读 855评论 0 1
  • 原文出处: neo1218 一般递归与尾递归 一般递归 执行: 可以看到, 一般递归, 每一级递归都需要调用函数,...
    PyChina阅读 2,143评论 1 8

友情链接更多精彩内容