2011-03-12 51 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);