2012-08-16 42 views
0

所以我試着找出解決這個問題的辦法,但是我的程序表現得很奇怪。#12歐拉項目:找到超過500個因子的第一個三角形數

#include <iostream> 
using namespace std; 

int triangle_numbers(int n, int meh = 0) 
{ 
    int count = 0; 

    //calculate how many divisors there are for meh 
    for(int i = 1; i <= meh; i++) 
     if(meh%i == 0) 
      count++; 

    //if the number of divisors for meh is over 500, return meh 
    if(count > 500) 
     return meh; 

    //recursive call to increment n by 1 and set meh to the next triangle number 
    triangle_numbers(n+1, meh += n); 
} 

int main() 
{ 
    int cc = triangle_numbers(1); 
    cout << cc << endl; 
} 

如果我輸出mehcount單獨我得到準確的結果,所以我不知道爲什麼我的計劃是給我同樣的號碼(4246934),即使我做,說,if(count > 10)。我有一種感覺,它可能與我的遞歸調用,但我迄今嘗試過的一切都沒有奏效。任何幫助?

回答

3

您錯過了完成遞歸所需的最後return語句(編譯器是否不會警告triangle_numbers在所有情況下都不會實際返回某些內容?)。

一旦meh終值已經計算出來,你需要有

return triangle_numbers(n+1, meh += n); 

使meh可以備份調用堆棧,並最後到main一路返回。

現在看到的數字可能是遞歸結束後遺留在堆棧上的值。

備註:該算法的經典優化是讓i迭代到meh/2,但沒有更多。很明顯,大於meh的一半的數字不能均勻分配,因此可以跳過它們。

+0

謝謝。我只是覺得回到這裏就足以結束這個電話。儘管現在這個工作正常,而且我已經提到了你所提到的優化,但我的經驗是需要很長時間才能完成。會使這個函數尾遞歸幫助嗎? – 2012-08-16 22:05:54

+0

@BobJohn:該函數已經是尾遞歸的,所以沒有。通過保持呼叫之間的功能以避免不止一次計算相同結果([動態編程](http://en.wikipedia.org/wiki/Dynamic_programming)),並同時應用更多數學。第n個三角形數可以直接用'n *(n + 1)/ 2'來計算,這在我們試圖計算其因子時非常有用。 – Jon 2012-08-17 07:47:13