我一直在尝试比较C中的函数速度,有些东西我无法理解,
我试图获得素数之和(1到100000)
在递归中我得到2.1 ....秒
int sumOfPrime(unsigned int top)
{
if( top % 2 == 0 ) top -= 1;
static int total = 2; // sum of prime numbers
int i;
int control=0; // prime or not
if( top == 2 | top < 2) return total;
for (i = 3; i < (top/2)+1; i++)
{
if( top % i == 0 ) // if there is a multiple
{
control++;
break;
}
}
if( control == 0 ){
total += top;
}
return sumOfPrime(top-2);
}
迭代中的是O(n ^ 2)我得到1.14秒
int sumOfPrime(unsigned int top)
{
unsigned int total = 2;
int count;
int i,j;
for (i = 3; i < top; i+=2)
{
count = 0;
for (j = 3; j < (i/2)+1; j+=2)
{
if( i % j == 0 )
{
count++;
break;
}
}
if( count == 0 ){
total += i;
}
}
return total;
}
然后我在尾递归中尝试了它,但我的2.1几乎完全相同,
int sumOfPrime(unsigned int top,unsigned int total)
{
if( top % 2 == 0 ) top -= 1;
//static int total = 2;
int i; // for for loop
int control=0; // prime or not
if( top == 2 | top < 2) return total+2;
for (i = 3; i < (top/2)+1; i++)
{
if( top % i == 0 ) // if there is a multiple
{
control++; // add +1 to control
break;
}
}
if( control == 0 ){ // if its primme
total += top;
}
return sumOfPrime(top-2,total);
}
这是我们在某些情况下使用递归加速的东西,比如merge-sort那么这样的情况是什么?
是否有一些关于何时使用速度的特定规则?或者我错过了什么? 递归比迭代更舒服,我真的想用它,但这种速度差异让我肚子痛。