1递归算法思想本质
在程序中不断反复的调用自身来达到求解问题。
2递归算法分类
直接递归:在方法中调用方法本身;间接调用:间接的调用一个方法。
3例子–递归算法
有阶乘 就是1到N的所有自然数相乘的结果,n的阶乘为
n!=n*(n-1)*(n-2)…..*2*1;
对于(n-1)则有如下表达式
(n-1)!=(n-1)*(n-2)*…*2*1;
可以推出N!=n*(n-1)!
java代码表示
long fact(int n){
if(n<=1)
return 1;
else
return n*fact(n-1);
}
<—————————————->
4分而治之的适用范围
应用于计算步骤比较复杂的问题,通过将问题简化而逐步得到结果。
5分而治之的步骤
将该问题分解成m个问题,且问题互相独立:递归的解决这些子问题:合并得到原问题的解;
6例子–区分假币
袋子里有30个硬币,其中一个是假币,假币比真币轻一点,如何区分
java代码如下
int falsecoin(int coin[],int low,int high){
int i,sum1,sum2,sum3;
int re=0;
sum1=sum2=sum3=0;
if(low+1=high)
{
if(coin[low<coin[high])
{
re=low+1;
return re;
}
}
if(high-low+1)%2==0)
{
for(i=low;i<low+(high-low)/2;i++)
{
sum1=sum1+coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum1=sum1+coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum2=sum2+coin[i];
}
if(sum1>sum2)
{
fr=falsecoin(coin,low+(high-low)/2+1,high);
return re;
}
else if(sum1<sum2)
{
re=falsecoin(coin,low,low+(high-low)/2;
return re;
}
else
{
}
}
esle
{
for(i=low;i<=low+(high-low)/2-1;i++)
{
sum1=sum1+coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum2=sum2+coin[i];
}
sum3=coin[low+(high-low)/2];
………
}