因此对于以下代码,我试图减少函数调用本身的时间,以使其更有效。该代码的目的是使用递归执行求幂。
int expo(const int m, const unsigned int n)
{
funcCallCounter++; //counts how many times the function is called
if (n == 0)//base case
{
return 1;
}
else if (n % 2 == 0)// for even numbers
return expo(m*m, n / 2);
else
return m * expo(m, n - 1);//for odd numbers
}
答案 0 :(得分:3)
这是我最喜欢的递归博览会方法,它总是比您的方法更少调用
int expo(int a, int n) {
funcCallCounter++;
if (n == 0) {
return 1;
}
int r = expo(a, n / 2);
if (n % 2 == 0) {
//Even n
return r * r;
}
else {
// Odd n
return a *r*r;
}
}
答案 1 :(得分:0)
您可以使用班次来加快执行速度。
n % 2
可以替换为n & 0x01
n / 2^k
可以替换为n >> k
除法约为20个周期,而移位仅为1-2个周期。
但是,也许编译器自己看到了taht并且已经进行了优化。
最佳