从数学归纳法到递归算法
文章目录
- 数学归纳法(Mathematical Induction, MI)
- 递推算法(Recursion method, RM)
- 递归算法(Recursive algorithm, RA)
- 由数学归纳法到递归算法
从数学归纳法到递归算法
数学归纳法(Mathematical Induction, MI)
简介
常用的数学证明方法,属于完全严谨演绎推理方法,常被用于证明给定命题在给定定义域范围内成立,而广义的数学归纳法也可用于证明一般的良基关系,如集合论中的树,广义数学归纳法在数学逻辑和计算机科学领域被称为结构归纳法
思维步骤
证明
任意给定情形都是正确的
核心要点
需要弄到两个条件即可证明
- 知道第一个元素是满足要求的
- 知道前一个元素满足要求和后一个元素满足要求之间具有某种固定联系。这样就可以通过一个一个的递推证明出所有元素是满足要求的
分析过程
第一步
通常证明 N = 1 时成立,并把 N = 1 带入关系式,得出 N = 1 满足关系式
第二步
证明 N > 1 时,假设 N - 1 时该关系式成立可以进一步成功推出 N 时该关系式也是成立的
总结
想要求出一系列的数据满足某种条件,这一系列的数据又满足某种环环相扣的联系,那么你只需要知道锁链的一端,也就是第一个元素,你还需要知道环环之间是如何相扣的,也就是环环之间的联系,就可得到锁链中的每一个环节,这就是数学归纳法的基本思想
模型
已知 n = 1 满足关系式,n > 2 时,通过 n - 1 满足关系式推出 n 满足关系式,即可证明
例题
请尝试用数学归纳法证明:
n∈N*
时,1/(1×3) + 1/(3×5) + 1/(2n-1)(2n+1) = n/(2n+1)
递推算法(Recursion method, RM)
简介
递推是一个数学上的概念,如数列中常见的递推式,
a[n] = a[n-1] + a[n-2]
,数学上的递推函数在计算机中可以通过递归来实现,也可以不通过递推来实现思维步骤
求解
有三个或更多个元素之间有某种关系(如
a[n]
,a[n - 1]
,a[n - 2]
),已知初始值,求 n 为某个值时候a[n]
的值核心要点
需要两种思路,两种思路都可以用程序来解决
- 抓住循环,层层往上求解(递推)
- 抓住关系式和初始条件(递归)
总结
递推算法抓住循环要点,一层层往上计算数值即可,虽然代码量较多,也不如递归来的精巧,但时间复杂度却比递归要少
模型
已知至少两个初始值,层层网上推演,计算较大值
例题
请尝试用递归和非递归的方法求解 n 等于某一值时
a[n]
的值(斐波那契数列)递归实现
int function(int n){if(n<=2)return 1;return function(n - 1) + function(n - 2); }
这里是计算机中的函数 function(n) 但是却很类似于数学中的式子
a[n]
,return 相当于等于什么,也就是function(n) = function (n - 1) + function(n - 2)
,当然这是需要 n > 2 时,也就类似于数学式a[n] = a[n - 1] + a[n - 2]
,计算机中会不断循环调用自己,最后有个出口 n <= 2 时,程序弹出并层层向上返回。但计算机这里用到了循环,n = 3 计算了 3 次,n = 4 计算了 5 次,n = 5 计算了 9 次,n = 6 计算了 15 次,n = 7 计算了 25 次…后一个次数是前两个次数之和 + 1。这里不做时间复杂度计算分析,以后的博文中会介绍时间复杂度以及空间复杂度利用计算机理论和数学知识来进行分析和计算。用数据结构中的知识是其时间复杂度是 n - 1 不完全二叉树的节点数,所以近似是O(2^n)
,用数学方法计算,可以将其转化为二阶常系数齐次差分方程,最后可以解出约等于O(1.618^n)
,即指数级复杂度O(2^n)
,这里也不做详细讲解,学过些高等数学的都需要会解非递归实现
int function(int n){int f1 = 1, f2 = 1;if(n <= 2)return 1;for(int i = 3; i <= n; i++){int f = f1 + f2;f1 = f2;f2 = f;}return f; }
实际上就是抓住了循环二字,进而求出
a[n]
,其时间复杂度为O(n)
递归算法(Recursive algorithm, RA)
简介
计算机科学中指将重复问题分解为同类的子问题来进行解决的方法,目前绝大部分编程语言都是支持函数自调用,递归方法实际上就是一个没有 for 和 while 的循环
思维步骤
见上面的递推算法中的思维步骤
另外再说一个递归算法的核心要点:如果把递推看成层层往上叠,进行循环求解,那么递归可以直接看成一个树形结构,利用数据结构的知识即可求解递归算法中需要了解的东西
总结
递归比较像倒着推理的递推或者说倒着推理的数学归纳法,但最后求解依然是需要两个基本要素:1.初始值 2.关系式。递归方法可以想象成一个树形结构图,那么求解递归方法的时间复杂度也很容易求了,就是树的节点数
O(2^n)
的,递推算法可以想象成层层往上叠,不断循环求解元素的模型。递推和递归实际上是同一个问题的两种思维方式罢了,都是为了解决同一个问题模型
把规模较大的难题转化为多个新的较简单的问题,而这些问题的解决方式仍与原问题一样,只是处理对象不同,就这样问题越分越多,但是问题的难度也越来越小,直到找到“出口”——初始值
例题
见上面递推算法中的例题
由数学归纳法到递归算法
总结
站在一个更高的高度来看待这些问题,其实依旧逃不开两个要素:1.初始值 2.关系式。
数学归纳法是正向推理,一条锁链从头到尾,递归是逆向推理,一条锁链从尾到头,到达端点后再依次从头到尾,最后解决问题。
数学归纳法是已知一个值满足条件(锁链的头端)(初始值),当知道 n - 1 满足条件和 n 满足条件之间具有某种关系后(锁链环与环之间是如何连接的)(关系式),即可证明关系式成立
递归是已知多个初始值(锁链的头端)(初始值),当知道
a[n]
,a[n + 1]
,a[n + 2]
之间具有某种关系后(锁链环与环之间是如何连接的)(关系式),即可求解较大值数学归纳法是一个值,递归多个值,数学归纳法是值满足条件,递归是值等于什么,数学归纳法是值满足条件和值满足条件之间的关系,递归是值与值之间的关系,数学归纳法是证明关系式,递归是求解 n,当把值满足条件看成值等于多少(值等于多少从本质来看就是值满足一个什么条件),这样来说数学归纳法和递归算法从本质来讲就是一个东西
从数学归纳法到递归算法相关推荐
- 从“数学归纳法”到理解“递归算法”!
每章一点正能量:人的一生可能燃烧也可能腐朽. 前言 相信大家在面试或者工作中偶尔会遇到递归算法的提问或者编程,我们今天来聊一聊从数学归纳法到理解递归算法.如有错误还请大家及时指出~ 本文已同步至 Gi ...
- 从“数学归纳法”到理解“递归算法”
前言 相信大家在面试或者工作中偶尔会遇到递归算法的提问或者编程,我们今天来聊一聊从数学归纳法到理解递归算法.如有错误还请大家及时指出~ 本文已同步至 GitHub/Gitee/公众号,感兴趣的同学帮忙 ...
- 纸上谈兵:数学归纳法,递归,栈
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 数学归纳法 数学归纳法(mathematical induction)是一种数学证 ...
- 递归算法时间复杂度分析
递归算法时间复杂度分析 时间复杂度: 一般情况下,算法中基本操作重复的次数就是问题规模n的某个函数f(n),进而分析f(n)随n的变化情况并确 ...
- 算法导论------递归算法的时间复杂度求解
目录 1.算法设计与分析概述 2.非递归算法分析 3.递归算法分析 3.1利用数列知识 3.2代入法 3.3递归树 3.4主方法求解递推式 4.参考资料 1.算法设计与分析概述 在总结递归算法的时 ...
- 递归树求递归算法时间复杂度
开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治 ...
- 汉诺塔问题的递归算法和非递归算法分析
汉诺塔问题的递归算法和非递归算法分析 不想看文字的可以在B站看详细的讲解,点击蓝字->汉诺塔问题的递归和非递归算法 问题描述 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是 ...
- java递归算法经典实例_Java实现简单的递归操作方法实例
前言 在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的 ...
- 递归算法-Java实现简单的递归操作
在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的循环迭 ...
- 5.2 递归算法及设计思想
这一章节比较简单,就归纳总结一下递归的思想. 0 定义及内涵 这一思想应该是简单而重要的一种算法思想,所以我们也最先介绍一下其思想和应用.可以参考博客的介绍:https://blog.csdn.net ...
最新文章
- api怎么写_API数据加密框架monkeyapiencrypt
- SGU 224.Little Queens
- java集合:ArrayList
- Proximal Algorithms--Accelerated proximal gradient method
- 双系统windows10扩容ubuntu16.04
- 数组的几种定义方式及初始化
- hdfs客户端的学习理解
- MarkDown模板:接口文档
- Cisco简单配置(十三)—链路聚合
- hbase 报:Java::JavautilConcurrent::TimeoutException:The procedure 1 is still running
- 看似美好,实则无奈,水果业上限如此?
- 一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤
- 导出word单元格间隔空白问题
- 数据结构栈的简单实现(JAVA)
- 附件统一处理starter,含附件客户端和附件服务端
- 谁引爆了手机里的电池?
- H265/HEVC视频分层码流分析语义元素解释
- emlog程序仿小刀娱乐网模板最终版本
- python编程用什么软件?Pycharm好不好?
- Python 学习笔记——求余数操作符 % 在数学计算中的应用-try_006_02