一、递归:
“ 大懒支小懒 ”
1 . 递归函数 : 用函数自身给出定义的函数。(通俗来讲,即 自己玩自己)
2 . 两个要素:边界条件 递归方程。
3 . 递归算法:直接或间接调用自身的算法。
4 . 优点:算法简明、正确性易证明;
5 . 缺点:执行效率不高 、堆栈空间耗费;
总之,递归是分析、设计的有力工具。
6 . 具体实例:
(1) . 阶乘问题:
计算 n!
递归思想:将规模为 n 的大问题转化为规模为 n-1 的一个小问题进行求解。
#include <iostream>
using namespace std;
long int n;
long int result;
int multi(int n)
{
if(n==0) return 1; //是递归的边界条件
else return n*multi(n-1); //当 n>0时,n!=n(n-1)!,是该递归的递归方程
}
int main()
{
cin >> n;
result=multi(n);
cout << result;
return 0;
}
’
(2) . 斐波那契数列 Fibonacci:
无穷数列 1,1,2,3,5,8,13,21,34,55,. . . . . . .(后一项的值是前两项数值之和)
递归思想:将规模为 n 的大问题转化为规模为 ( n-1 )和(n-2) 的两个小问题进行求解。
#include <iostream>
using namespace std;
int n;
int Fibonacci(int n)
{
if( n==1 || n==2) return 1; //边界条件
else return Fibonacci(n-1)+Fibonacci(n-2); //是相应的递归方程
}
int main()
{
cin >> n;
cout << Fibonacci(n);
return 0;
}
(3) . 整数划分问题:
将正整数表示成一系列正整数之和,这种表示称为一个划分。
求正整数 n 的不同的划分个数。
例如:正整数n = 6有如下11种不同的划分:
6 5+1 4+1+1 3+1+1+1 2+1+1+1+1 1+1+1+1+1+1
4+2 3+2+1 2+2+1+1
3+3 2+2+2
因此,我们可以考虑增加一个变量,加数不大于m 的划分个数记为 q (n , m )
#include <iostream>
using namespace std;
int n;
int m;
int spilt(int n,int m)
{
if( n==1 || m==1) return 1;
if( m==n ) return 1+spilt(n,m-1);
if( n>m ) return spilt(n-m,m)+spilt(n,m-1);
if( n<m ) return spilt(n,n);
}
int main()
{
cin >> n;
cout << spilt(n,n);
return 0;
}