递归函数
一.知识点
1. 定义:直接或间接调用自身的函数。包括公式递归和枚举递归。
2. 基本思想:大型复杂问题——层层转化——规模较小的问题
3. 关键:找出递归定义和递归终止条件
4. 步骤:(1)分析问题,找出大问题和小问题之间的关系
(2)找出停止条件
(3)设计函数体,确定参数
二.例题
1.整数的因子分解
#include<bits/stdc++.h>
using namespace std;
int total;
void solve(int n)
{
if(n==1)total++;
else for(int i=2;i<=n;i++)
if(n%i==0)solve(n/i);
}
int main()
{
int n;
while(cin>>n)
{
total = 0;
solve(n);
cout<<total<<endl;
}
}
2.半数集问题
#include<bits/stdc++.h>
using namespace std;
int comp(int n)
{
int ans=1;
if (n>1) for(int i=1;i<=n/2;i++)
ans+=comp(i);
return ans;
}
int main()
{
int n;
cin>>n;
cout<<comp(n);
}
3.放苹果:a个苹果放到b个盘子里
#include<bits/stdc++.h>
using namespace std;
int fpg(int m,int n)
{
if(m==0||n==1)
return 1;
if(n>m)
return fpg(m,m);
else
return fpg(m,n-1)+fpg(m-n,n);
}
int main()
{
int n,a,b,i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a>>b;
cout<<fpg(a,b);
}
}
三.学习心得
递归函数相对于普通函数可以用来解决更更复杂的问题,使用递归函数的关键就是分析好题目,学会如何把一个复杂的问题层层分解成简单问题,即复杂问题与简单问题之间的关系,公式还是枚举。其次是找到递归的终止条件,即在什么时候问题的答案已经显而易见,不必再继续运算,可以回溯到式子中