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

时间:2015-04-27 12:08:56

标签: c++ recursion

我有这段代码:

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;
}

1 个答案:

答案 0 :(得分:0)

我可能会对主教进行审判而不是在董事会上进行循环:

首先放置一位主教,然后递归放置第二位,依此类推,直到你到达最后一位 当您从递归返回时发生回溯,当您尝试下一个替代方案时,为单个主教,然后再次递归。 直到你用完了选项 - 就在你完成的时候。

这是一个粗略的概述:

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)

选择位置需要一些思考,以便不会多次找到同一个解决方案。