递归函数的学习

所谓递归就是允许程序调用自己本身的过程或函数。然面此程序却不能无限制地调用自己,否则将永不停止。也就是说,它必须有一个“终止条件”,当程序碰到此终止条件就不用再调用自己,而直接将结果算出来返回给调用者。

解决方法有两种:

1、  自顶向下的形态

2、  将大问题拆成子问题的类型

下面以八皇后的问题来说明:

源代码:

#include <stdio.h>

#include <math.h>

 

 

#define MAX_QUEEN 12

int queen[MAX_QUEEN];

int count=0;

 

int attack(int k,int i)

{

       int flag=0;

       int a=0;

       int m;

       while((a<k)&&(flag==0))

       {

              m=queen[a];

              if(m==i||abs(k-a)==abs(i-m))

                     flag=1;

     a++;

       }

 return flag;

}

 

 

void place( int k)

{

       int i=0;

       int j;

       while (i<MAX_QUEEN&&k<MAX_QUEEN)

       {

              if(!attack(k,i))

                     {

                            queen[k]=i;

                            if (k==MAX_QUEEN-1)

                            {

 

                             for(j=0;j<MAX_QUEEN;j++)

                             printf("queen[%d]=%d /n",j,queen[j]);

                 count++;

                            }

                        else

                           place(k+1);

                     }

              i++;

              }

 

}

 

void main()

{

       int c;

       printf("%d queen question /n",MAX_QUEEN);

       place(0);

       printf("There are %d results /n",count);

   while(1)

    c++;

 

}

 

可相应改MAX_QUEEN 的值

MAX_QUEEN=4 , count=2;

  MAX_QUEEN=8 , count=92;

  MAX_QUEEN=12 , count=14200 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值