递推
递推算法的特点一个问题的求解需要大量重复计算,在已知的条件和所求问题之间总存在着某种相互联系的关系,在计算时,我们需要找到这种关系,进行计算(递推关系式)。即递推法的关键,就是找到递推关系式,这种处理方式能够将复杂的计算过程,转化为若干步骤的简单重复运送,充分利用计算机运行程序时的时间局部性和空间局部性。
递推算法的思想:
-
首要问题是先找到各个相邻数据项之间的递推关系
-
递推关系避开了求通项公式的麻烦,且有些题目的通项公式很难求,或者不能进行求解
-
将复杂问题分解为若干步骤的简单运算
-
一般来说递推算法就是一种特殊的迭代算法。
递推算法的一般步骤:
-
根据题目确定数据项,并找到符合要求的递推关系式
-
根据递推关系式设计递推程序
-
根据题目找到递推的终点
-
单次查询可以不进行存储,多次查询都要进行存储;按要求输出答案即可
递归
递归算法:递归算法是一种从自顶向下的算法,实际上是通过不停的直接调用或者间接的调用自身的函数,通过每次改变变量完成多个过程的重复计算,直到到达边界之后,结束调用。与递推法相似的是,递归与递推都是将一个复杂过程分解为几个简单重复步骤进行计算。递归算法的实现的核心是分治策略,即分而治之,将复杂过程分解为规模较小的同类问题,通过解决若干个小问题,进而解决整个复杂问题。
递归算法的思想:
-
将复杂计算过程转换为简单重复子过程
-
找到递归公式,即能够将大问题转化为小问题的公式
-
自上而下计算,在返回完成递归过程
递归算法设计的一般步骤:
-
据题目设计递归函数中的运算部分
-
根据题目找到递归公式,题目可能会隐含给出,也可能需要自己进行推导
-
找到递归出口,即递归的终止条件
记忆化
#include<bits/stdc++.h>
using namespace std;
int cnt=0; //统计执行了多少次递归
int data[25]; //存储斐波那契数
int fib (int n){
cnt++;
if(data[n]!=0) return data[n]; //记忆化搜索:已经算过,不用再算,直接返回结果
if (n == 1 || n == 2) { data[n]=1; return data[n]; }
data[n] = fib (n-1) + fib (n-2); //继续递归
return data[n];
}
int main(){
cout << fib(20); //计算第20个斐波那契数
cout <<" cnt="<<cnt; //递归了cnt=37次。
}