C中的尾递归?

Tail Recursion in C?

我有两个顾虑,

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

  2. 下面以指数函数的形式实现,以它为底 提升到它的力量,还有其他方法可以进一步提高吗 下面的函数?

这是我的代码:

#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);
}
  1. 当然可以,为什么不呢?

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

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

    并且你的累加器初始化为 1:

    return power(1, m, n);
    

    此外,n / o 可能应该更改为 unsigned 因为您的代码不处理负指数(并且如果不更改为非整数类型就不能).

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

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;
    }
}

我们使用临时值,不会用递归计算相同的值两次。