递归算法
定义:自己调用自己(需要调用栈来执行)
两个基本要素:边界条件(何时结束)和 递归模式(大问题如何转化为小问题)
关键:根据递推关系式写程序(用数学归纳法证明)
注意:递归算法在数据量特别大的时候会出现段错误(例如:递归运算100000000!时)
例题
#include <bits/stdc++.h>
using namespace std;
long long int fun(long long int n);
int main()
{
long long int n;
while(cin>>n)
cout<<fun(n)<<endl;
return 0;
}
long long int fun(long long int n)
{
long long int k;
if(n==0||n==1)
k=1;
else
k=fun(n-1)*n;
return k;
}
/*
阶乘函数的另一种写法
long long int fun(long long int n)
{
return n==0?1:f(n-1)*n;
}
*/
#include <bits/stdc++.h>
using namespace std;
int fib(int n);
int main()
{
int n;
while(cin>>n)
{
n=n%8;//找到循环节
if(fib(n)==0)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
int fib(int n)//递归法计算
{
if(n==0)
return 1;
else if(n==1)
return 2;
else
return (fib(n-1)+fib(n-2))%3;
}
#include <bits/stdc++.h>
using namespace std;
int fun(int n);
int main()
{
int n;
while(cin>>n)
{
if(n==0)
break;
int ans=fun(n);
cout<<ans<<endl;
}
return 0;
}
int fun(int n)
{
if(n==1)
return 1;
else
return 2*(fun(n-1)+1);//用递归实现
}
#include <bits/stdc++.h>
using namespace std;
int a[100];
int dfs(int n);
int main()
{
int n;
a[0]=1;
for(int i=1; i<=30; i++)
a[i]=a[i-1]*2;
cin>>n;
dfs(n);
return 0;
}
int dfs(int n)
{
int k;
while(n)
{
for(int i=1; i<=30; i++)
if (a[i]>n)
{
k=i-1;
break;
}
n-=a[k];
if (k==0&&n>0)
cout<<"2(0)+";
if (k==0&&n==0)
cout<<"2(0)";
if (k==1&&n>0)
cout<<"2+";
if (k==1&&n==0)
cout<<"2";
if (k==2&&n>0)
cout<<"2(2)+";
if (k==2&&n==0)
cout<<"2(2)";
if (k>2)
{
cout<<"2(";
dfs(k);
if (n>0)
cout<<")+";
else
cout<<")";
}
}
return 0;
}
数的计算-递归
#include <bits/stdc++.h>
using namespace std;
int num=0;
int dfs(int n)
{
for(int i=1; i<=n/2; i++)
{
num++;
dfs(i);
}
return 0;
}
int main()
{
int n;
cin>>n;
dfs(n);
cout<<num+1<<endl;
return 0;
}
数的计算加强版-递推
#include <bits/stdc++.h>
using namespace std;
long long a[10001];
int main()
{
int n;
cin>>n;
a[0]=a[1]=1;
for(int i=1; i<=n; i++)
{
if (i&1)
a[i]=a[i-1];
else
a[i]=a[i-1]+a[i/2];
}
cout<<a[n]<<endl;
return 0;
}
数字分段-递归
#include <bits/stdc++.h>
using namespace std;
int a[100];
int n,k;
int dfs(int r,int l)
{
int s=0;
for(int i=r; i>=l; i--)
{
s+=a[i];
if (s>k)
{
dfs(i,l);
cout<<i+1<<" "<<r<<endl;
return 0;
}
}
cout<<1<<" "<<r<<endl;
}
int main()
{
cin>>n>>k;
for(int i=1; i<=n; i++)
cin>>a[i];
dfs(n,1);
return 0;
}
白与黑
#include <bits/stdc++.h>
using namespace std;
int w,h; //定义公有变量 长和宽
char z[21][21];
int f(int i,int j);
int main()
{
while(cin>>w>>h)
{
if (w==0&&h==0)
break;
for(int i=1; i<=h; i++)
for(int j=1; j<=w; j++)
cin>>z[i][j];
for(int i=1; i<=h; i++)
for(int j=1; j<=w; j++)
if (z[i][j]=='@')
cout<<f(i,j)<<endl;
}
return 0;
}
int f(int i,int j)
{
if (i<1||i>h||j<1||j>w) //处理边界
return 0;
if (z[i][j]!='#')
{
z[i][j]='#';
return 1+f(i,j-1)+f(i,j+1)+f(i-1,j)+f(i+1,j);
}
else
return 0;
}
数字分段-递归
#include <bits/stdc++.h>
using namespace std;
int a[100];
int n,k;
int dfs(int r,int l)
{
int s=0;
for(int i=r; i>=l; i--)
{
s+=a[i];
if (s>k)
{
dfs(i,l);
cout<<i+1<<" "<<r<<endl;
return 0;
}
}
cout<<1<<" "<<r<<endl;//这句处理第一段!
}
int main()
{
cin>>n>>k;
for(int i=1; i<=n; i++)
cin>>a[i];
dfs(n,1);
return 0;
}