C中的尾递归?

时间:2016-07-18 07:12:05

标签: c tail-recursion

我有两个问题,

  1. 尾递归函数可以有两个以上的参数吗?

  2. 以下以指数函数实现,以它为基础 提升到它的力量,还有其他方式可以进一步改善 以下功能?

  3. 这是我的代码:

    #include <stdio.h>
    
    int power(int m,int n, int o);
    int powerAux(int m, int n);    
    main() {
        printf("%d\n", powerAux(2,3));
    }
    int power(int m, int n, int o) {
        if (o == 1) {
            return m;
        }
        return power(m*n, n, o - 1);
    }
    int powerAux(int m, int n) {
        return power(m, m, n);
    }
    

2 个答案:

答案 0 :(得分:3)

  1. 当然,为什么不呢?

  2. 您的函数不会处理0的指数。您的基本情况应更改为:

    if (o == 0) {
        return m;
    }
    

    并将您的累加器初始化为1

    return power(1, m, n);
    

    此外,n / o应该更改为unsigned,因为您的代码不会处理负指数(并且它无法更改为非指数)积分类型)。

答案 1 :(得分:1)

通过实施快速乘法算法,您绝对可以提高函数的效率:

int exp(int base, int pow) {
    if (pow == 0) {
        return 1;
    }
    if (pow%2 == 0) {
        int temp = exp(base, pow/2);
        return temp*temp;
    } else {
        int temp = exp(base, (pow-1)/2);
        return temp*temp*base;
    }
}

我们使用temp值来计算递归时两次计算相同的值。