這是我處理的代碼:這個程序需要很長時間才能關閉'返回'在main()的
#include <iostream>
#include <map>
using namespace std;
static unsigned long collatzLength(unsigned long n) {
static std::map<unsigned long,int> collatzMap;
int mapResult = collatzMap[n];
if (mapResult != 0) return mapResult;
if (n == 1) {
return 1;
} else {
collatzMap[n] = 1 + collatzLength(n%2==0?n/2:3*n+1);
return collatzMap[n];
}
}
int main() {
int maxIndex = 1;
unsigned int max = 1;
for (int i=1; i<1000000; i++) {
//cout<<i<<endl;
unsigned long count = collatzLength(i);
if (count > max) {
maxIndex = i;
max = count;
}
}
cout<<maxIndex<<endl;
getchar();
cout<<"Returning..."<<endl;
return maxIndex;
}
當我編譯和運行這個程序(使用Visual Studio 2012和Release構建設置),它需要像10秒(我的計算機上)關閉程序後打印「正在返回...」
這是爲什麼?
注意:我知道這個程序寫的不好,我可能不應該在collatzLength上使用'static',也不應該爲該函數使用緩存,但是我對如何使這個代碼更好,我只關心它爲什麼需要這麼多才能結束。
首先運行需要多長時間?另外,每隔一段時間打印出一次'collatzMap'的大小可能會很有趣。很可能是破壞者仔細地釋放每一個需要這麼長時間的節點。 –
collatzMap的最終尺寸約爲2,162,685。該漏洞程序需要約50secs在我的機器上運行 –
嘗試運行釋放目標。如果調試速度很慢,那麼Visual Studio實現的額外安全性在發行版中實際上不是必需的。 (基本上用不同的方式來說SEbastian Redl說的) –