数据结构与算法之递归

用循环实现阶乘

阶乘的规则就是输入数字n计算乘积.例如n为3计算结果为1*2*3。此算法的时间复杂度为O(n)

public static long f1(long n) {
        long sum = 1;
        for (long i = n; i >= 1; i--) {
            sum *= i;
        }
        return sum;
    }

递归实现阶乘

此算法的时间复杂度为O(n)

public static long f2(long n) {
        if (n == 1) {
            return 1;
        }
        return n * f2(n - 1);
    }

尾递归实现阶乘

上边的递归有个特点,每次方法入栈,栈帧都会保留变量 n 因为要从下一个栈帧中返回结果后计算.这就是递归的最大缺点,如果递归方法中有大量的成员变量需要保留

在栈帧中则每次递归都需要占用大量的内存.尾递归正弥补了这个缺点.将当前帧中需要计算的步骤通过实参传递给下一个栈帧,这样当前栈帧就不需要保留任何的变量.

此算法的时间复杂度为O(n)

public static long f3(long n1, long n2) {
        if (n2 == 1) {
            return n1;
        } else {
            return f3(n1 * n2, n2 - 1);
        }
    }

 

 
posted @ 2022-03-23 11:18  顶风少年  阅读(66)  评论(0编辑  收藏  举报
返回顶部