【问题标题】:Changing iterative algorithm to recursive in C在 C 中将迭代算法更改为递归
【发布时间】:2015-10-20 18:15:28
【问题描述】:

嘿,我是编程新手,我在递归算法方面没有太多经验,我正在为自己开发一个简单的棋盘游戏,我必须在二维数组中搜索 '2' 并替换 ' 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';

            }

        }
    }
}

}

这是我通过迭代检查数组的函数,但是对于大型电路板执行时间太长,我想避免这种情况,所以我想将它更改为递归会使其更快。这就是我被卡住的地方,我找不到将这个算法更改为递归算法的方法。

我不希望你写代码,因为我正在努力学习编码,但如果可能的话,我需要一些线索/提示来帮助我入门。提前感谢您的帮助,如果这个问题不好,我们深表歉意。

【问题讨论】:

  • 我不知道为什么递归可能更快,但是(至少)需要两个基本操作:确保有一个退出子句,这样你就不会得到无限递归,并找到一个防止两次访问同一方格的机制 - 例如在 floodfill 绘制算法中。
  • 我怀疑递归算法会更快。在我看来,它的代码可能更短,但速度不会改变。此外,它甚至可能会减少,因为要运行递归函数,您的计算机将需要复制大量数据。
  • 在让它更快之前,让它正确。这些邻居(arr[v][b-1]arr[v][b+1],...)都不能保证存在。您正在分配的数据之外进行读写。另外,为什么只检查 3 个邻居?
  • 也许在学习递归之前学习如何使用真正的二维数组可能会很好。您在这里使用的只是通过指针数组进行的模拟。改变这一点真的可以提高你的速度。

标签: c algorithm recursion


【解决方案1】:

对于这个问题,我看不出递归解决方案会比迭代解决方案更快。

通常递归在对它们没有很好支持的语言(例如非函数式语言)上表现更差。这对 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);
  }
}

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2013-04-15
    • 2016-06-29
    • 1970-01-01
    相关资源
    最近更新 更多