递归算法

自己直接或间接的调用自己


1.明白函数功能
2.要有结束条件




举几个例子:


阶乘
n!  (n-1)!*n
0!=1  1!=1  


int fac(int n)
{
if(n<2) return 1;
else 
return n*fac(n-1);
}




//求和
a[0]+a[1]+a[2]+a[3]+.....+a[n-2]+a[n-1]


int addarr(int a[],int n)
{
if(n<1) return 0;
               else return (addarr(a,n-1)+a[n-1]);


}


int addarr(int a[],int n)
{
if(n<1) return 0;
else return (addarr(a+1,n-1)+a[0]);
}


将a[0.....n-1] 逆序存放


到只剩下一个或一个也不剩的时候结束
void reverse(int a[],int n)
{
  int k=n;
int temp;
if(n>1)
{
temp=a[0];
a[0]a[n-1];
a[n-1]=temp;
reverse(a+1,n-2); //z怎么会是n-2;
}



较复杂问题:




八皇后问题
标记
行,列:a[9]=0;
斜线:b[15]=0;-7...7;c[15]=0;2...16;15+15 条斜线,规律...


ans[8] 
try(int i)//为第i行上的皇后选位置
{
循环:j:1...8
判断: j位置是否能放:同一行列,对角线上不能放
1.占据j位置;
2.标记;
3.如果i==8 输出。
否则 try(i+1)
4.清除标记,回溯。
 


跳马问题


马的日字型跳法。
5*5---9*9 防止数组越界
从(2,2)开始,不重复地跳满所有位置,输出跳的方法




a[][]


Jump(i,j,n)


{
for(i=0;i<8;i++)
{
1.计算新的位置值。(i1,j1)
2.如果位置(i1,j1) 未被占
则(1)标记该位置
 (2)如果n==25 则输出结果,
否则 jump(i1,j1,n+1);
  (3).清除标记。释放位置(i1,j1);//回溯

}
}

































你可能感兴趣的:(递归算法)