最近做OJ题,容器用的多了就形成习惯了,很多DFS的地方都不喜欢用递归了,再加上很多公司笔试总喜欢出一些递归改迭代的问题,却鲜有迭代改递归的,于是逐渐有了迭代高大上而递归native的感觉。然而最近碰到一道回溯的题目,同样的思想,我使用了stack容器实现DFS,测试用时280ms,而是用递归实现的DFS大多用时50ms左右。于是对递归和迭代进行了下面的测试。
首先测试递归调用10000000次的时间,这其实就是调用10000000次函数的时间,但是我们仍然还是写成递归的形式:
void test(int i) {
if (i < 0) return;
test(i-1);
}
为了测试简单,test函数就调用一次自己。由于VC编译器生成的函数堆栈有限,所以递归深度就定在1000,重复10000次,测试代码如下:
int start = GetTickCount();
for (int i = 0; i < 10000; ++i) test(1000);
int end = GetTickCount();
cout << end - start << endl;
测试用时约为400ms。
使用stack容器实现迭代运算,测试代码如下:
stack<int> stk;
int top = -1;
int tmp;
int start = GetTi