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