1. 递归
两个条件:子问题必须与原始问题相同,且规模更小;不能自身无限调用,必须要有递归出口
#include<iostream>
#include<cstdio>
using namespace std;
long long Factorial(int n)
{
if(n==0)
return 1;
else
return n*Factorial(n-1);
}
int main()
{
int n;
while(cin>>n)
{
cout<<Factorial(n)<<endl;
}
return 0;
}
2. 分治
步骤:1)将原问题分解为规模更小的多个子问题。2)将子问题逐个解决。3)将已解决的子问题合并,得到原答案 分治法在分解子问题时也要用到递归的思想
#include<iostream>
#include<cstdio>
using namespace std;
int GetNumber(int n,int m)
{
if(m>n)
return 0;
else
return 1+GetNumber(n,m*2)+GetNumber(n,m*2+1);
}
int main()
{
int n,m;
while(cin>>m>>n)
{
cout<<GetNumber(n,m)<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
void F(int n)
{
char a[100];
int index=0,num=-1;
while(n)//将n化为二进制,用字符数组存储
{
a[index]=n%2+'0';
if(a[index=='1'])//统计二进制中1的个数
num++;
index++;
n/2;
}
for(int i=index-1;i>=0;--i)//倒序遍历字符数组,即从左到右遍历二进制形式的n
{
if(i>1&&a[i]=='1')//遇到1就开始递归
{
cout<<"2(";
F(i);//二进制形式某位为1,代表这是是一个子问题
cout<<")";
}
else if(i==1&&a[i]=='1')//边界1
cout<<"2";
else if(i==0&&a[i]=='1')//边界2
cout<<"2(0)";
if(a[i]=='1'&&(num--)>0)//一个子问题解决
cout<<"+";
}
}
int main()
{
int n;
while(cin>>n)
{
F(n);
cout<<endl;
}
return 0;
}