判断尾递归好坏的策略与方法?

最近看了些代码,频繁看到递归的写法。无意中想起尾递归,例如时间复杂度、受制于栈空间、while循环替换等等。作为CSDN的粉丝,好奇下,提出第一个问题,讨论下尾递归。如有CSDN用户提供解答方案,不胜感激。🙂

一般是在尾递归形式下引入一个新的参数 比如result,用来记录当前计算结果。在每次递归调用中,都将 result 乘以当前计算的数 n,然后将 n 减1。当 n 的值小于等于1时,停止递归调用,直接返回计算结果 result。
尾递归并不是解决所有递归函数问题的万能方法有些复杂的递归函数可能无法轻易改写为尾递归形式,此时需要寻找其他适当的算法或数据结构来解决问题

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/158777
  • 除此之外, 这篇博客: 一道二进制子串算法让面试官都解不出来?中的 的CSDN! 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这是一个有质量,有态度的博客

    前端技术栈

  • 您还可以看一下 CSDN讲师老师的CSDN互联网大数据应用主题月视频课程中的 互联网非结构化数据在美国互联网运营分析中的应用-2小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    尾递归函数是指递归函数在递归调用处只调用自己并且是当前函数执行的最后一项操作,因此不需要在栈中保存当前函数的状态,可以利用循环的方式来代替递归实现,从而避免了由于递归调用导致的内存溢出或栈溢出等问题。

    判断是否是尾递归函数的两个条件: 1. 递归调用的函数是当前函数本身或者是将结果直接返回,没有其他的操作 2. 递归调用是当前函数中的最后一项操作。

    优化尾递归函数可采用以下策略: 1. 循环优化:通过循环替换递归,将递归转换为循环。 2. 尾递归优化:将尾递归转化为迭代式计算,避免创建新的栈帧。 3. 空间压缩:由于尾递归函数只有一个栈帧,可以把中间结果记录到变量中,不必创建额外的数组来记录状态,从而避免内存溢出。

    以下是一个尾递归函数的例子和优化方式:

    // 求斐波那契数列的第n项,使用尾递归实现
    public int fibonacci(int n, int pre, int cur){
        if (n == 0) {
            return pre;
        }
        if (n == 1) {
            return cur;
        }
        return fibonacci(n-1, cur, pre+cur);
    }
    

    循环优化和尾递归优化:

    // 循环优化
    public int fibonacci(int n){
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        int pre = 0, cur = 1;
        for (int i = 2; i <= n; i++) {
            int tmp = cur;
            cur = pre + cur;
            pre = tmp;
        }
        return cur;
    }
    
    // 尾递归优化
    public int fibonacci(int n, int pre, int cur){
        if (n == 0) {
            return pre;
        }
        if (n == 1) {
            return cur;
        }
        return fibonacci(n-1, cur, pre+cur);
    }
    
    public int fibonacciTail(int n) {
        return fibonacci(n, 0, 1);
    }
    

    空间压缩:

    public int fibonacci(int n){
        if(n<=0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        int pre=0,cur=1;
        for(int i=2;i<=n;i++){
            int temp=cur;
            cur=pre+cur;
            pre=temp;
        }
        return cur;
    }
    

    参考资料:https://blog.csdn.net/zhanxiaoxue/article/details/79660661 https://blog.csdn.net/zyxint/article/details/105680356