私は別の演習を行っており、次のことを行う必要があります。
「8 クイーンのチェス問題のすべての解を出力する再帰関数を作成し、解の数を返します。関数のプロトタイプは次のようにする必要があります: int function(void)
引数なしの規則を回避するために、静的変数を使用しました。
私は(Googleの助けを借りて)それを行いましたが、動作しますが、ループの使用が許可されておらず、何らかの理由で最後の2つのループをループfor
に変換できません.for
while
それは私を夢中にさせます、それは簡単なはずです! それを台無しにするのは再帰だと思います...
作業関数は次のとおりです。
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;
}
そして、最後の2つの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 ループがありますか? 私は再帰に慣れていないので、理解したと思っていましたが、間違っていたようです...