递归函数速度与迭代函数速度

时间:2014-11-19 16:01:19

标签: c algorithm recursion

我一直在尝试比较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那么这样的情况是什么?

是否有一些关于何时使用速度的特定规则?或者我错过了什么? 递归比迭代更舒服,我真的想用它,但这种速度差异让我肚子痛。

0 个答案:

没有答案