【问题标题】:C convert for loop into a while loop and recursionC将for循环转换为while循环和递归
【发布时间】:2013-07-20 12:27:58
【问题描述】:

我正在做另一个练习,我必须:

“写一个递归函数打印八皇后国际象棋问题的所有解,返回解的个数,函数原型必须是:int function(void)

为了解决 no argument 规则,我使用了 static 变量。

我已经完成了(在谷歌的帮助下),它可以工作,但他们不允许使用 for 循环,并且由于某种原因我无法将最后两个 for 循环转换为 @ 987654323@ 循环。

这让我发疯,这应该很容易!我认为是递归搞砸了......

这是工作函数:

int function()
{
    static int count = 0;
    static int col = 0;
    const int n = 8;
    static int hist[8] = {10, 10, 10, 10, 10, 10, 10, 10};
    int i1 = 0;

    if (col == n) {
        count++;
        while (i1++ < n)
        {
            putchar('0' + hist[i1-1] + 1);
        }
        putchar('\n');
    }

    for (int i = 0; i < n; i++) {
        int j = 0;
        for (j = 0; j < col && !(hist[j] == i || (hist[j] - i) == col - j || -(hist[j] - i) == col - j); j++);

        if (j < col) {
            continue;
        }
        hist[col] = i;
        col++;
        function();
        col--;  
    }
    return count;
}

我尝试将最后两个 for 循环转换为 while 循环,如下所示:

int i = 0;
while (i < n)
{
    int j = 0;
    while (j < col && !(hist[j] == i || (hist[j] - i) == col - j || -(hist[j] - i) == col - j))
    {
        j++;
    }

    if (j < col) {
        continue;
    }
    hist[col] = i;

    col++;
    function();
    col--;
    i++;
}

但它不起作用,for 循环是否比看起来更多?我是递归新手,我以为我明白了,但似乎我错了......

【问题讨论】:

  • forwhile 转换部分对我来说似乎是正确的。这是你唯一改变的吗?
  • 是的,这都是问题所在,你可以试试,第一个有效,第二个无效:/
  • 因此,您只更改了最后一个 for 循环,其余部分保持不变。我希望你保留了退货声明。
  • 是的,我保留了所有内容并尝试更改 for 循环

标签: c loops recursion syntax


【解决方案1】:

您可以将第一个循环更改为

    while(i++<n)

而且效果很好。

【讨论】:

    【解决方案2】:

    我运行了代码并发现了问题。它与线

    if (j < col) {
        continue;
    }
    

    由于这不是进入for 循环的continue 语句,因此您也必须在这种情况下增加i

    if (j < col) {
        i++;      // add this line
        continue;
    }
    

    【讨论】:

    • 这就是 StackExchange 的意义所在:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2020-09-05
    • 2018-02-22
    • 2017-04-26
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多