递推与递归

本文中部分内容转自他人博客,作者相关信息以及博客地址在文末。

概念

  • 递归:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为递归。
  • 递归的定义:在一个函数的定义中又直接或间接地调用本身。
  • 递归思想: 把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。
  • 递归优点: 符合人的思维方式,递归程序结构清晰,可读性,容易理解
  • 递归缺点: 通过调用函数实现,当递归层数过多时,程序的效率低。例如求Fibonacii数列的第1000项?
  • 递归的应用场合:

1、数据的定义形式是递归的,例如求Fibonacii数列的第n项 。

2、数据之间的逻辑关系(即数据结构)是递归的,如树、图等的定义和操作。

3、某些问题虽然没有明显的递归关系或结构,但问题的解法是不断重复执行一组操作,只是问题规模由大化小,直至某个原操作(基本操作)就结束。例如:汉诺塔问题。

  • 递归设计的要素:

1、在函数中必须有直接或间接调用自身的语句;

2、在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口(或递归边界)。

编写递归算法时,首先要对问题的以下三个方面进行分析:

  • 决定问题规模的参数。

需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?把它们找出来。

  • 问题的边界条件及边界值。

在什么情况下可以直接得出问题的解?这就是问题的边界条件及边界值。

  • 解决问题的通式。

把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或公式来实现?这是解决递归问题的难点。把这些步骤或公式确定下来。

  • 递推:递推算法是一种用若干步可重复运算来描述复杂问题的方法。递推是序列计算中的一种常用算法。通常是通过计算机前面的一些项来得出序列中的指定象的值。
  • 递推:数学推导 发现规律 重复简单运算
  • 递归与递推区别:相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值。

算法举例1

  • 斐波那契数列:已知f(1) = 1 , f(2) = 1 , 且满足关系式f(n) = f(n-1) + f(n-2),则f(50)等于多少?
  • 分析:根据初始条件f(1) = 1 , f(2) = 1 和关系式f(n) = f(n-1) + f(n-2),可知,f(3) = f(2) + f(1) , f(3) = f(2) + f(1) …….
  • 编写代码(递归)
public class Fibonacci {static int fun(int n){if(n == 1 || n == 2){return 1 ;}else{return fun(n-1) + fun(n-2) ;}}public static void main(String[] args) {for(int i = 1 ; i <= 15 ; ++i)System.out.println(fun(i));}
}
  • 编写代码(递推)
static int fun2(int n){int a[] = new int[20] ;a[1] = 1 ;a[2] = 1 ;for(int i=3 ; i<=n ;i++){a[i] = a[i-1] + a[i-2] ;}return a[n] ;}
  • 运行结果:

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610

算法举例2

  • 使用递归计算1+2+…+100 ;
  • 分析:递归关系为f(n) = f(n-1) + n ,递归出口为f(1) = 1 ;
  • 编写代码(递归):
public class Sum {static int fun(int n){if( n == 1){return 1 ;}else{return fun(n-1) + n ;}}public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(fun(100));}
}
  • 编写代码(递推)
static int fun2(int n){int a[] = new int [200] ;a[1] = 1 ;for(int i=2 ; i<=n ; i++){a[i] = a[i-1] + i ;}return a[n] ;}
  • 运行结果:

5050

算法举例3

  • 爬楼问题:假设有n阶楼梯,每次可爬1阶或2阶,则爬到第n层有几种方案?
  • 问题分析:
  • 假设一阶时只有一种方案f(1) = 1 ;
  • 二阶时有两种方案(即一次走一阶和一次走两阶)f(2) = 2 ;
  • 三阶时有3种 f(3) = 3 ;
  • 四阶时有五种 f(5) = 5 ;
  • 发现递归规律f(n) = f(n-1) + f(n-2) ;
  • 递归出口为f(1) = 1、f(2) = 2 ;
  • 编写代码(递归):
public class Ladder {static int fun(int n){if(n == 1){return 1 ;}else if(n == 2){return 2 ;}else{return fun(n-1) + fun(n-2) ;}}public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(fun(5));}
}
  • 编写代码(递推):
static int fun2(int n){int a[] = new int [200] ;a[1] = 1 ;a[2] = 2 ;for(int i=3 ; i<=n ;i++){a[i] = a[i-1] + a[i-2] ;}return a[n] ;}
  • 运行结果:

8

由上述例子可知,递归的重点是找到递归关系和递归出口。

递 推 小 结:

1、递推是从已知条件开始;

2、递推必须有明确的通用公式;

3、递推必须是有限次运算。

递 归 小 结:

1. 递归:未知的推到已知的,再由此返回。

2. 基本思想:将复杂的操作分解为若干重复的简单操作。

关于递推与递归的文章还有:

1. https://blog.csdn.net/a1046765624/article/details/66530637

2. 
--------------------- 
作者:叶清逸 
来源:CSDN 
原文:https://blog.csdn.net/u013634252/article/details/80551060 
版权声明:本文为博主原创文章,转载请附上博文链接!

递推与递归 (区别)相关推荐

  1. 0x02.基本算法 — 递推与递归

    目录 一.递推与递归 二.分治 三.模拟计算机实现递归 四.相应习题: 0.AcWing 92. 递归实现指数型枚举(递归/循环+位运算) 1.AcWing 93. 递归实现组合型枚举 2.AcWin ...

  2. 算法设计与分析 1 递推与递归

    递推与递归 Fibonacci #include<stdio.h> #pragma warning (disabled:4996) #define MAX 100 int f[MAX];/ ...

  3. 基本算法之递推与递归的简单应用

    递推与递归的简单应用 常见的枚举形式 实现指数型枚举 DFS (一) DFS (二) 位运算(一) 位运算(二) 实现组合型枚举 DFS + 剪枝 实现排列型枚举 DFS 费解的开关 奇怪的汉诺塔 分 ...

  4. 算法总结之递推与递归

    递推算法 递归算法大致包括两方面的内容:1)递归起点 : 2)递归关系 递推起点 递归起点一般由题目或者实际情况确定,不由递归关系推出.如果无法确定递归起点,那么递归算法就无法实现.可见,递归起点是递 ...

  5. 昆虫繁殖(继续理解递推和递归)

    昆虫繁殖(继续理解递推和递归) /*[题目描述] 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对卵要过两个月长成成虫.假设每个成虫不死,第一个月只有一对 ...

  6. 递推和递归(C语言)

    文章目录 前言 一.递推原理 1.递推概念 2.递推关系 3.递推特点 4.递推详例 5.解决递推问题的步骤 二.递归原理 1.递归的概念 2.构成递归的条件 3.递归的模板 4.递归详例 三.递推和 ...

  7. 算法设计分析之------ 递推与递归篇二

    递推与递归篇二 递归 Secret Cow Code S 黑白棋子的移动 递推(动态规划) 覆盖墙壁 递归 Secret Cow Code S 题目链接:Secret Cow Code S 解题思路 ...

  8. Python 递推 与 递归

    Python 递推 与 递归 结论 递推" :解决问题,需要推算各个数据直接的关系,并以此罗列关系. "递归" : 不是用来解决问题,而是大事化小,小到一定地步,问题迎刃 ...

  9. 斐波那契数列的递推与递归求法

    斐波那契数列的递推与递归求法: OVERVIEW 斐波那契数列的递推与递归求法: (1)递推求Fibonacci: (2)递归求Fibonacci: (3)递归求Fibonacci(记忆化数组优化): ...

最新文章

  1. 分治:分治和动态规划的区别,二分检索递归和迭代方式实现
  2. iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码
  3. Linux nohup和的功效
  4. SEO按天扣费系统商业网站源码
  5. 百度前端学院参考答案:第二十五天到第二十七天 倒数开始 滴答滴 滴答滴(2)...
  6. DOM(四)——事件、事件模型(冒泡)与事件对象的功能
  7. 开发一个大型后台管理系统,真的需要用前后端分离的技术方案吗?
  8. linux中使用ntpdate命令进行时间更新时出现the NTP socket is in use, exiting
  9. Servlet的单例模式
  10. CWnd的派生类-1、CFrameWnd类
  11. 转 Linux调优方案,sysctl.conf的设置
  12. 软件使用,Microsoft Visual C++运行库合集包
  13. 如何安装红旗linux6.0声卡驱动
  14. BUUCTF RSA(二)
  15. java知识点总结(面试)
  16. 三款免费杀毒软件+clamAV
  17. php如何截取出视频中的指定帧作为图片
  18. 生日快乐,我想念你们
  19. np.vstack(tup)使用
  20. linux怎么打开pak文件怎么打开,如何在 Linux 上安装并启用 Flatpak 支持?

热门文章

  1. markdown语法之表格
  2. Arduino与Proteus仿真实例-74LS378触发器驱动仿真
  3. python-定时给指定微信女朋友发送天气预报和每日一句自动聊天抢红包抢票
  4. easyexcel实现代码生成xlsx文件并保存到云端
  5. 【转自虎嗅】段永平在斯坦福与华人学生交流分享
  6. java 压缩jar_Java基础之实现解压和压缩jar、zip、rar等源码分享
  7. 风之语.惊闻周星驰电影票房超过30亿RMB
  8. <2021SC@SDUSC>博客(9)山东大学软件工程应用与实践Jpress代码分析(8)
  9. Android 刘海屏适配全攻略
  10. 2021-07-24 VMware workstation界面语言改为中文