[英]Optimise a recursive function
對於 n = 18,我的代碼在 1GHz 機器上花費的時間超過 0.5 秒。 我認為這是因為我使用了遞歸函數,但我真的不知道如何優化這段代碼,因為它實際上只是“打印”數字......因此,問題可能來自於我是使用遞歸函數。
這是我的代碼:
#include<iostream>
void singleSquareRemove (int s)
{
if (s == 1)
{
std::cout << 1 << std::endl;
return;
}
else
{
for (int i = s-1; i >=1; --i)
singleSquareRemove(i);
std::cout << s << std::endl;
}
}
void whenSquareisFull (int v)
{
if (v == 1)
{
std::cout << 1 << std::endl;
return;
}
else if (v == 2)
{
std::cout << 2 << std::endl;
return;
}
else if (v == 3)
{
std::cout << 1 << std::endl;
std::cout << 3 << std::endl;
return;
}
else
{
whenSquareisFull(v-2);
for (int i = v-3; i > 0; --i)
singleSquareRemove(i);
std::cout << v << std::endl;
}
}
int main()
{
unsigned int n {0};
std::cin >> n;
whenSquareisFull(n);
for (int i = n-1; i > 0; --i)
{
singleSquareRemove(i);
}
}
時間接收器是在您打印值並刷新輸出 ( std::endl
) 時。
您可以通過使用一種“緩沖區”來避免該時間下沉,例如std::vector
然后您可以迭代打印。 通過這種方式,時間花在實際的“計算”上,然后您可以對其進行分析,而不是花時間在打印輸出上。
使用您的代碼的示例:
#include <iostream>
#include <vector>
static std::vector<int> values;
void singleSquareRemove (int s)
{
for (int i = s - 1; i >= 1; --i)
singleSquareRemove(i);
values.push_back(s);
}
void whenSquareisFull (int v)
{
switch (v) {
case 1: case 2:
values.push_back(v);
break;
case 3: {
values.push_back(1);
values.push_back(v);
} break;
default: {
whenSquareisFull(v - 2);
for (int i = v - 3; i > 0; --i) singleSquareRemove(i);
values.push_back(v);
} break;
}
}
int main()
{
unsigned int n {0};
std::cin >> n;
// start timing here
whenSquareisFull(n);
while (--n > 0) singleSquareRemove(n);
// stop timing here
for (auto itr = values.begin(); itr != values.end(); ++itr)
std::cout << *itr << std::endl;
return 0;
}
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.