72. 尾递归

尾递归的性能比普通递归要高,而且编译器能优化尾递归。

//
// Created by zhgxun on 04/12/2017.
//
#include <stdio.h>

int fact(int n);
int tail(int n, int a);

int main(void)
{
    int num = 0;
    num = fact(10);
    printf("%d\n", num);

    int b = 0;
    b = tail(10, 1);
    printf("%d\n", b);
}

/**
 * 递归求阶乘
 * @param n
 * @return
 */
int fact(int n)
{
    // 逐级递归, 最终退出时逐级相乘, 编译器无法优化
    // 必须保存上一次活跃区以维持函数调用信息
    if (n < 0) {
        return 0;
    } else if (n <= 1) {
        return 1;
    } else {
        return n * fact(n - 1);
    }
}

/**
 * 尾递归求阶乘
 * @param n
 * @param a
 * @return
 */
int tail(int n, int a)
{
    // 每次递归都将结果保存下来, 直接返回乘积, 编译器可以优化
    // 无需保存上一次活跃区直接覆盖即可
    if (n < 0) {
        return 0;
    } else if (n == 0) {
        return 1;
    } else if (n == 1) {
        return a;
    } else {
        return tail(n - 1, n * a);
    }
}