C中的尾递归?
Tail Recursion in C?
我有两个顾虑,
尾递归函数可以有两个以上的参数吗?
下面以指数函数的形式实现,以它为底
提升到它的力量,还有其他方法可以进一步提高吗
下面的函数?
这是我的代码:
#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);
}
当然可以,为什么不呢?
您的函数不处理 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;
}
}
我们使用临时值,不会用递归计算相同的值两次。
我有两个顾虑,
尾递归函数可以有两个以上的参数吗?
下面以指数函数的形式实现,以它为底 提升到它的力量,还有其他方法可以进一步提高吗 下面的函数?
这是我的代码:
#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);
}
当然可以,为什么不呢?
您的函数不处理
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;
}
}
我们使用临时值,不会用递归计算相同的值两次。