尾递归(TailRecursion)

package example.test;

/**
 * 尾递归
 * 
 * 2018-01-11
 *
 */
public class TailRetrate {

    public static void main(String[] args) {
        int r = factorialRecursion(5);
        System.err.println(r);

        r = factorialTailRecursion(5, 4);
        System.err.println(r);

        // F(10) 从0, 1开始 第10位是几?
        r = fibonacciTailRecursion(10, 1, 1);
        System.err.println(r);

        r = fibonacciRecursion(10);
        System.err.println(r);

        r = fibonacci(10);
        System.err.println(r);

    }

    /**
     * 阶乘计算 -- 递归解决
     *
     * @param number
     *            当前阶乘需要计算的数值
     * @return number!
     */
    public static int factorialRecursion(final int number) {
        if (number == 1)
            return number;
        else
            return number * factorialRecursion(number - 1);
    }

    public static int factorialTailRecursion(final int factorial, final int number) {
        return number == 1 ? factorial : factorialTailRecursion(factorial * number, number - 1);
    }

    /**
     * 斐波那契数列(Fibonacci sequence)
     * 
     * 普通实现
     * 
     * @param n
     * @return
     */
    public static int fibonacciRecursion(int n) {
        // return n < 2 ? n : fibonacciRecursion(n - 1) + fibonacciRecursion(n - 2);
        if (n < 2) {
            // StackTraceElement[] ts = Thread.currentThread().getStackTrace();
            // System.err.println(ts.length);
            return n;
        }

        return fibonacciRecursion(n - 1) + fibonacciRecursion(n - 2);
    }

    /**
     * 斐波那契数列(Fibonacci sequence)
     * 
     * 尾递归实现
     * 
     * @param n
     *            第几位
     * @param a
     *            从第一位开始
     * @param b
     *            从第二位开始
     * @return
     */
    public static int fibonacciTailRecursion(int n, int a, int b) {
        if (n <= 2) {
            // StackTraceElement[] ts = Thread.currentThread().getStackTrace();
            // System.err.println(ts.length);
            return b;
        }

        return fibonacciTailRecursion(n - 1, b, a + b);
        // return n <= 2 ? b : fibonacciTailRecursion(n - 1, b, a + b);
    }

    /**
     * 斐波那契数列(Fibonacci sequence)
     * 
     * 非递归实现
     * 
     * @param n
     * @return
     */
    public static int fibonacci(int n) {
        int first = 0;
        int second = 1;
        int fn = 0;
        for (int i = 2; i < n + 1; i++) {
            fn = first + second;
            first = second;
            second = fn;
        }
        return fn;
    }
}
原文地址:https://www.cnblogs.com/jpit/p/8268308.html