【发布时间】: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 循环是否比看起来更多?我是递归新手,我以为我明白了,但似乎我错了......
【问题讨论】:
-
for到while转换部分对我来说似乎是正确的。这是你唯一改变的吗? -
是的,这都是问题所在,你可以试试,第一个有效,第二个无效:/
-
因此,您只更改了最后一个
for循环,其余部分保持不变。我希望你保留了退货声明。 -
是的,我保留了所有内容并尝试更改 for 循环