2011-03-12 67 views
0

后,我对用这种方法计算最近的素数这个的C代码:Ç - 回报递归

int countPrime(int number) { 
int dest=number; 
int i; 
int p; /*p=0 - not prime number*/ 

if (dest%2 != 0){ 
    int odm=(int)sqrt(dest); 
    p=1; //pressume prime number 

    for(i=3;i<=odm;i++){ 
     if((dest/i)*i == dest){ 
      p=0; 
     dest=dest++; 

     countPrime(dest); 

     } 
} 

}else{ 
    if (dest == 2){ 
     p=1; 
    dest=2; 
    return dest; 
}else{ 
    p=0; 
    dest=dest++; 
    countPrime(dest); 
    } 
} 
return dest; 
} 

它看起来像这种方法算错,但是当我使用递归(我称之为内同样的方法该方法),我有回报问题。显然,首先会从recused方法返回,然后由方法countPrime的第一次运行覆盖。有谁知道,如何解决它?第一次运行不会停止,我只能得到真正的递归结果吗?

感谢

+0

很肯定你需要重新考虑你的算法。你也可以解释一下“计数最接近的素数”是什么意思? – DTing 2011-03-12 11:52:30

回答

2

你可能忘了写return countPrime(dest);也代替dest = dest++;只写dest++;。在这个变化之后我编译了你的程序,它工作得很好!

我没有试图理解为什么这个工作,但是当你在不同的地方写一个递归函数的每个返回保存,所以你函数将返回正确的结果,而不是一些步骤的结果。

4

countPrime()每次调用得到的它自己的一套局部变量。当分配给dest你在调用堆栈的当前级别分配给的dest副本。

任何这样的算法是要需要你传递值回落调用堆栈。你的根本问题是,你忽略了从递归调用countPrime()返回的值。

我没有详细研究你的算法,但因为你理解了算法,你应该能够在这里工作了。

2

您可能需要使用return countPrime(dest);