优化递归函数

Optimise a recursive function

本文关键字:递归函数 优化      更新时间:2023-10-16

对于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;
}

希望对您有所帮助!