【问题标题】:Converting function to use iteration转换函数以使用迭代
【发布时间】:2017-07-13 04:01:19
【问题描述】:

我编写了一个递归函数来访问数组元素。每 2 次、3 次、4 次,以此类推到 150 次。我想做同样的事情,但要进行迭代。我在下面编写了一些代码,它运行的第一个示例,但我不确定它是否正确并且与第一个函数的工作方式相同。我知道我正在使用两个 for 循环来执行此操作,我可能将索引 var 放置在错误的位置。

void openarray(skip)
{
    int i;
    for(i = skip; i < 150; i+=skip + 1) 
    {
        if(arrayB[i] == open)
        {
            arrayB[i] = close;
        }
        else
        {
            arrayB[i] = open;
        }
    }
    if(skip < 150)
    {
        openarray(skip + 1);
    }
} 

我的代码变成了迭代,我想我可能混淆了 step 的索引,反之亦然。

int i, j;
for(i = 0; i < 150; i++) 
{
    for (j = 0; j < 150; j+=i + 1)
    if(arrayB[i] == open)
    {
        arrayB[i] = close;
    }
    else
    {
        arrayB[i] = open;
    }
}

【问题讨论】:

  • “我不确定它是否正确并且与第一个函数一样工作”。这就是测试的目的。设计您的测试并运行它们。如果结果错误,那么您就知道代码不正确。然后从那里开始调试。在 Stackoverflow 上发帖并不是测试或调试的第一步。
  • @kaylum 我试过一整天我一直在打印所有索引并跳过我无法弄清楚你不认为我一直在测试和尝试粗鲁假设的事情......
  • 那你为什么不这么说呢?分享您的测试结果 - 输入、预期输出、实际输出。这和minimal reproducible example 是所有 SO 问题都应该有的,以帮助读者了解您的具体问题。

标签: c for-loop recursion iteration


【解决方案1】:

第 1 步:让我们将递归调用放在最后。

void openarray(skip)
{
    int i;
    for(i = skip; i < 150; i+=skip + 1) 
    {
        if(arrayB[i] == open)
        {
            arrayB[i] = close;
        }
        else
        {
            arrayB[i] = open;
        }
    }

    if(skip >= 150)
        return;

    openarray(skip + 1);
} 

第 2 步:添加循环。

void openarray(skip)
{
    while (1) {
        int i;
        for(i = skip; i < 150; i+=skip + 1) 
        {
            if(arrayB[i] == open)
            {
                arrayB[i] = close;
            }
            else
            {
                arrayB[i] = open;
            }
        }

        if(skip >= 150)
            return;

        skip = skip + 1;
    } 
}

第 3 步:清理

void openarray(skip)
{
    for (; skip < 150; ++skip)
    {
        int i;
        for(i = skip; i < 150; i+=skip + 1) 
        {
            if(arrayB[i] == open)
            {
                arrayB[i] = close;
            }
            else
            {
                arrayB[i] = open;
            }
        }
    } 
}

我们可以将此与您的代码进行比较,以查看您犯了哪些错误:

  • 您已将外部循环计数器初始化为零。
  • 您使用外部循环计数器而不是内部循环计数器作为数组索引。

【讨论】:

  • 您正在根据不清楚和不完整的问题做出回答。 skip 变量的范围是多少?试试openarray(-1) 看看。
  • @Meninx - メネンックス,我不明白这个问题。对于openarray(-1),参考递归实现和提供的迭代实现的工作方式相同(即使它显然不是有效的输入)。
  • @ikegami 谢谢你,我认为这行得通!测试现在似乎与递归方法具有相同的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2019-10-13
  • 2020-08-08
  • 2015-05-30
相关资源
最近更新 更多