直接或间接调用自身的函数称为递归函数
它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归的基本思想
问题分解:
把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的小问题,
最小问题可以直接解决。
递归的关键在于找出递归定义和递归终止条件。
递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。
递归终止条件:也就是所描述问题的最简单情况,它本身不再使用递归的定义。
递归算法解题通常有三个步骤:
1)分析问题、寻找递归:找出大规模问题与小规模问题的关系,这样通过递归使问题的规模逐渐变小。
2)设置边界、控制递归:找出停止条件,即算法可解的最小规模问题。
3)设计函数、确定参数:设计函数体中的操作及相关参数。
整数的全排列问题,半数集问题,整数因子分解等问题都可以用递归解决
分解因数
描述
给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * ... * an,并且1 < a1 <= a2<= a3 <= ... <= an,问这样的分解的种数有多少。注意到a = a也是一种分解。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1< a < 32768)
输出
n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数
#include<bits/stdc++.h>
using namespace std;
int sum;
void count(int a,int b)
{
for(int i=a;i<b;i++)
{
if(b%i==0&&i<=b/i)
{
sum++;
count(i,b/i);
}
if(i>b/i)break;
}
}
int main()
{
int n;
int a;
cin>>n;
while(n)
{
sum=1;
cin>>a;
count(2,a);
cout<<sum<<endl;
n--;
}
}
心得体会
不是很分得清问题是否用到递归,有的可能用for循环就处理了,用递归反而不会用了,想不出来怎么写合适,思路不明确