递归和递推

递推

递推算法的特点一个问题的求解需要大量重复计算,在已知的条件和所求问题之间总存在着某种相互联系的关系,在计算时,我们需要找到这种关系,进行计算(递推关系式)。即递推法的关键,就是找到递推关系式,这种处理方式能够将复杂的计算过程,转化为若干步骤的简单重复运送,充分利用计算机运行程序时的时间局部性和空间局部性。

递推算法的思想:

  1. 首要问题是先找到各个相邻数据项之间的递推关系

  2. 递推关系避开了求通项公式的麻烦,且有些题目的通项公式很难求,或者不能进行求解

  3. 将复杂问题分解为若干步骤的简单运算

  4. 一般来说递推算法就是一种特殊的迭代算法。

递推算法的一般步骤:

  1. 根据题目确定数据项,并找到符合要求的递推关系式

  2. 根据递推关系式设计递推程序

  3. 根据题目找到递推的终点

  4. 单次查询可以不进行存储,多次查询都要进行存储;按要求输出答案即可

递归

递归算法:递归算法是一种从自顶向下的算法,实际上是通过不停的直接调用或者间接的调用自身的函数,通过每次改变变量完成多个过程的重复计算,直到到达边界之后,结束调用。与递推法相似的是,递归与递推都是将一个复杂过程分解为几个简单重复步骤进行计算。递归算法的实现的核心是分治策略,即分而治之,将复杂过程分解为规模较小的同类问题,通过解决若干个小问题,进而解决整个复杂问题。

递归算法的思想:

  1. 将复杂计算过程转换为简单重复子过程

  2. 找到递归公式,即能够将大问题转化为小问题的公式

  3. 自上而下计算,在返回完成递归过程

递归算法设计的一般步骤:

  1. 据题目设计递归函数中的运算部分

  2. 根据题目找到递归公式,题目可能会隐含给出,也可能需要自己进行推导

  3. 找到递归出口,即递归的终止条件

记忆化

#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次。
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值