将迭代算法改为C中的递归

时间:2015-10-20 18:15:28

标签: c algorithm recursion

嘿,我是编程方面的新手,而且我对递归算法没有多少经验,我为自己制作一个简单的棋盘游戏,我必须搜索' 2& #39;在二维数组中,如果它们存在,则替换左侧,右侧和下方的' 1。

现在我的问题是代码:

void check_board(char **arr, int grid_size)
{
int v, b;  // to check fillment
for(v=0; v < grid_size; v++)
{
    for(b=0; b < grid_size; b++)
    {
        if(arr[v][b]=='2' )
        {
            if(arr[v+1][b]=='1')
            {
                arr[v+1][b]='2';

            }
            if(arr[v][b+1]=='1')
            {
                arr[v][b+1]='2';

            }
            if(arr[v][b-1]=='1')
            {
                arr[v][b-1]='2';

            }

        }
    }
}

}

这是我通过迭代检查数组的函数,但执行大尺寸电路板需要太长时间,我想避免这种情况,因此我想将其更改为递归将使其更快。在我被困的地方,我无法找到将此算法更改为递归算法的方法。

当我尝试学习编码时,我不想要您编写的代码,但如果可能的话,我需要一些线索/提示让我开始。如果这个问题很糟糕,请提前感谢您的帮助和对不起。

1 个答案:

答案 0 :(得分:0)

我没有看到递归解决方案如何比这个问题的迭代解决方案更快。

通常,递归在对它们没有良好支持的语言上表现更差(例如,非函数语言)。这对C来说是正确的,因为递归给她带来了很多开销:

  • 很多函数调用
  • 激活记录的堆栈空间预留

递归在C语言中是有意义的,其中替代方法是在需要跟踪状态的所有问题中由代码本身管理递归结构,因为它将由递归本身的性质自动完成。或者说是有道理的,因为它通常能够用小代码表达对问题的优雅解决方案,但与效率无关。

在任何情况下,递归解决方案都需要基本案例和递归步骤,它看起来像:

void recursive_check_board(char **board, int size, int x, int y)
{
  if (x == size-1 && y == size-1) // base case
    return;
  else // recursive step
  {
    // set down, left, right to 2 if needed

    recursive_check_board(board, size, x+1, y);
    recursive_check_board(board, size, x, y+1);
    recursive_check_board(board, size, x+1, y+1);
  }
}