八皇后问题而引申出来的递归

今天做八皇后问题,起初是自己想的一个算法,觉得是自己想出来的才能够在以后的做题应种中更加的熟练,所以我是选择了自己写。可能是由于我对于递归的不熟练,和理解的不深刻,结果写的那个算法不好,我的return太多了,而且整个的思路感觉是混乱的,逻辑不清晰。就是没有真的明白递归的含义,递归的发生,就感觉是再用函数似的,可结果却不知道怎么返回,往哪里返回,返回了该怎么用,或者说下一步该怎么走。

void  queen(int a[],int y,int x)
{
    if(y>p){
       int i=1;
       while(i<p){
        printf("%d",a[i]);
        i++;
       }
        return ;
    }
    if(x<=p&&index(a,y,x)){
        a[y]=x;
       // if(queen(a,y+1,1)){
              queen(a,y+1,1);
       // }
    }
    else {
        if(x<=p)
          queen(a,y,x+1);
        else
          queen(a,y-1,a[y-1]+1);
    }
}

这是我的一个求queen的一个函数,可以看一下,其实我的思维是比较混乱的,而且觉得有点纠缠不清的感觉,到最后就成了硬凑的感觉了。迷迷糊糊的,感觉就像不经过思考了,不动脑子了。
//===========================

void eight_queen(int index)
    {
        int loop;

        for(loop = 0; loop < 4; loop++){
            if(check_pos_valid(index, loop)){
                gEightQueen[index] = loop;

                if(3 == index){
                    gCount ++, print();
                    gEightQueen[index] = 0;
                    return;
                }

                eight_queen(index + 1);
                gEightQueen[index] = 0;
            }
        }
    }

//==========================

void queen(int k,int n) //放置1~k的皇后
{  int j;
   if (k>n) 
    print(n);         //所有皇后放置结束
   else
    for (j=1;j<=n;j++) //在第k行上穷举每一个位置
       if (place(k,j)) //在第k行上找到一个合适位置(k,j)
       {    q[k]=j;
           queen(k+1,n);
       }
}

//===============================
以上是两个我觉得比较好的代码,就是思路很清晰,代码不是冗长的,而且处处都能看的出是经过思考的。


我觉得这是两种截然不同的递归思路,第一种不如第二种好理解,但是第一种真的动脑子了,我觉得,所以我很喜欢。
还有我觉得好的经典的代码也是需要熟练记忆的,它就像宝藏一样,需要不断的记忆,熟练掌握,然后从中慢慢的抽丝剥茧,有利于以后的创新,当面对新的问题的时候,可以先不慌,可以结合自己的经验,创造出适合这个问题的新的解决问题的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值