将多个循环转换为一个递归

Turning several loops into one recursion

本文关键字:一个 递归 循环 转换      更新时间:2023-10-16

我有这段代码:

for (int i=0; i<N; i++)
{
    int j;
    if (i%2==1) j=1;
    else j=0;
    for (; j<N; j+=2)
    {
        for(int k=0; k<N; k++)
        {
            int n;
            if (k%2==1) n=1;
            else n=0;
            for (; n<N; n+=2)
            {
                for (int l=0; l<N; l++)
                {
                    int o;
                    if (l%2==1) o=1;
                    else o=0;
                    for (; o<N; o+=2)
                    {
                        for(int m=0; m<N; m++)
                        {
                            int p;
                            if (m%2==1) p=1;
                            else p=0;
                            for (; p<N; p+=2)
                            {
                                if (check_full(lenta,i,j,k,n,l,o,m,p))
                                {
                                    count++;
                                    cout<<"Lenta uzsipilde: ("<<i<<","<<j<<"), "<<"("<<k<<","<<n<<"), "<<"("<<l<<","<<o<<"), "<<"("<<m<<","<<p<<"), "<<endl;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

有什么办法可以把它变成递归吗?基本上,这些循环可以找到给定问题的所有可能坐标。如果它可以转换为一个小递归,我是否需要使用数组而不是 8 个变量?

这是我尝试做的,但它不起作用:

void findBishops(){
    for (int i=0; i<N; i++){
        int j;
        if (i%2==1) j=1; 
        for (; j<N; j+=2){
            putIntoArray(array, i, j);
            if (isFull(board, array)){
                PrintAnswer(array);
            }else{
                arrayCount = arrayCount-2;
                findBishops();
            }
            }
    }
    }
void putIntoArray(array[], i, j){
    array[arrayCount++] = i;
    array[arrayCount++] = j;
}

我可能会递归主教而不是在棋盘上循环:

首先放置一个主教,

然后递归放置第二个主教,依此类推,直到你到达最后一个。
回溯发生在你从递归返回时,那就是你尝试下一个替代方案的时候,对于一个主教,然后再次递归。
直到你用完了选择——这就是你完成的时候。

这是一个粗略的轮廓:

place_bishop(this_bishop)
    if this_bishop is the final bishop:
        for every possible position of this_bishop:
            see if it's a solution and handle that
    else:
        for every possible position of this_bishop:
            place_bishop(next_bishop)

位置选择需要一些思考,以免多次找到相同的解决方案。