C 将函数转换为使用迭代

C 将函数转换为使用迭代,c,for-loop,recursion,iteration,C,For Loop,Recursion,Iteration,我已经编写了一个递归函数来访问数组元素。每隔2、3、4次,依此类推至150次。我想做同样的事情,但是需要迭代。我已经编写了下面的代码,它运行的第一个示例,但我不确定它是否正确,并且工作原理与第一个函数相同。我知道我使用了两个for循环来实现这一点,我可能把指数var放错了位置 void openarray(skip) { int i; for(i = skip; i < 150; i+=skip + 1) { if(arrayB[i] == ope

我已经编写了一个递归函数来访问数组元素。每隔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);
    }
} 
void openarray(跳过)
{
int i;
对于(i=跳过;i<150;i+=跳过+1)
{
if(arrayB[i]==打开)
{
arrayB[i]=关闭;
}
其他的
{
arrayB[i]=打开;
}
}
如果(跳过<150)
{
openarray(skip+1);
}
} 
我想我可能混淆了步骤的索引,或者相反

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;
    }
}
inti,j;
对于(i=0;i<150;i++)
{
对于(j=0;j<150;j+=i+1)
if(arrayB[i]==打开)
{
arrayB[i]=关闭;
}
其他的
{
arrayB[i]=打开;
}
}

步骤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);
} 
void openarray(跳过)
{
int i;
对于(i=跳过;i<150;i+=跳过+1)
{
if(arrayB[i]==打开)
{
arrayB[i]=关闭;
}
其他的
{
arrayB[i]=打开;
}
}
如果(跳过>=150)
返回;
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;
    } 
}
void openarray(跳过)
{
而(1){
int i;
对于(i=跳过;i<150;i+=跳过+1)
{
if(arrayB[i]==打开)
{
arrayB[i]=关闭;
}
其他的
{
arrayB[i]=打开;
}
}
如果(跳过>=150)
返回;
跳过=跳过+1;
} 
}
第三步:清理

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;
            }
        }
    } 
}
void openarray(跳过)
{
用于(;跳过<150;++跳过)
{
int i;
对于(i=跳过;i<150;i+=跳过+1)
{
if(arrayB[i]==打开)
{
arrayB[i]=关闭;
}
其他的
{
arrayB[i]=打开;
}
}
} 
}
我们可以将其与您的代码进行比较,以查看您犯了哪些错误:

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

“我不确定它是否正确,工作原理与第一个功能相同”。这就是测试的目的。设计并运行测试。如果结果是错误的,那么您知道代码是不正确的。然后从那里开始调试。在Stackoverflow上发帖并不是测试或调试的第一步。@kaylum我已经试了一整天了我一直在打印所有的索引和skip我搞不懂你不认为我一直在测试和尝试一些粗鲁的假设……那你为什么不这么说?分享您的测试结果-输入、预期输出、实际输出。这就是所有这些问题都应该帮助读者知道你的具体问题是什么。你是在回答一个不清楚和不完整的问题。
skip
变量的范围是多少?尝试使用
openarray(-1)
并查看。@Meninx-メネンックス, 我看不出有什么问题。参考递归实现和提供的迭代实现对于
openarray(-1)
(尽管它显然不是一个有效的输入)的工作原理相同。@ikegami谢谢你,我认为这是可行的!现在的测试似乎和递归方法具有相同的输出