算法总结——JS实现递归
目录
一、递归定义
百度百科
其他
二、循环与递归
三、几个经典题
斐波那契数
题目
基本思路
递归解法
动态规划解法
汉诺塔
题目
基本思路
一、递归定义
百度百科
递归,就是在运行的过程中调用自己。
函数嵌套调用过程示例
构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
其他
递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用。
你可能想知道如何实现调用自身的函数。诀窍在于,每当递归函数调用自身时,它都会将给定的问题拆解为子问题。递归调用继续进行,直到到子问题无需进一步递归就可以解决的地步。
为了确保递归函数不会导致无限循环,它应具有以下属性:
- 一个简单的基本案例 —— 能够不使用递归来产生答案的终止方案。
- 一组规则,也称作递推关系,可将所有其他情况拆分到基本案例。
二、循环与递归
举个栗子,你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇们...但是当你开到某扇门时,发现前方是一堵墙无路可走了,你选择原路返回——这就是递归
但是如果你打开一扇门后,同样发现前方也有一扇们,紧接着你又打开下一扇门...直到打开最后一扇门出去,或者一直没有碰到尽头 (死循环)——这就是循环。
三、几个经典题
斐波那契数
题目
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
f(n) = f(n-1) + f(n-2)
基本思路
上面那个链接可以用递归求解
这道题在剑指offer
中实际是当作递归的反例来说的。(用动态规划来解)
递归的本质是吧一个问题分解成两个或者多个小问题,如果多个小问题存在互相重叠的情况,那么就存在重复计算。
f(n) = f(n-1) + f(n-2)
这种拆分使用递归是典型的存在重叠的情况,所以会造成非常多的重复计算。
另外,每一次函数调用爱内存中都需要分配空间,每个进程的栈的容量是有限的,递归层次过多,就会造成栈溢出。
递归是从最大数开始,不断拆解成小的数计算,如果不去考虑递归,我们只需要从小数开始算起,从底层不断往上累加就可以了,其实思路也很简单。
递归解法
/*** @param {number} n* @return {number}*/
var fib = function(n) {if(n<=1){return n}return fib(n-1)+fib(n-2)
};
动态规划解法
/*** @param {number} n* @return {number}*/
var fib = function(n) {if(n<=1){return n}let pre=0,current=1,result=0,i=1while(i++<n){result=pre+currentpre=currentcurrent=result}return result
};
汉诺塔
题目
在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。
请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。
你需要原地修改栈。
基本思路
采用递归的思路
三要素如下:
递归结束条件:只剩下最后一个盘子需要移动
递归函数主功能:
1.首先将 n-1 个盘子,从第一个柱子移动到第二个柱子
2.然后将最后一个盘子移动到第三个柱子上
3.最后将第二个柱子上的 n-1 个盘子,移动到第三个柱子上
函数的等价关系式:
f(A,B,C,n) 表示将n个盘子从A移动到C
f(A,B,C,n)=f(A,C,B,n-1)+f(A,B,C,1)+f(B,A,C,n-1)
/*** @param {number[]} A* @param {number[]} B* @param {number[]} C* @return {void} Do not return anything, modify C in-place instead.*/
var hanota = function(A, B, C) {let n=A.lengthreturn move(A,B,C,n)
};
function move(A,B,C,n){if(n===0) return;move(A,C,B,n-1)C.push(A.pop())move(B,A,C,n-1)
}
算法总结——JS实现递归相关推荐
- 查找和排序算法的js实现
查找和排序算法的js实现 查找和排序算法的js实现 二分查找(适用于有序述组) 选择排序 快速排序 归并(合并)排序 查找和排序算法的js实现 学习算法时,将算法手写实现,加深记忆. 二分查找(适用于 ...
- 第一个算法项目 | JS实现并查集迷宫算法Demo学习
0 参考链接 并查集,不就一并和一查? 520,花了一夜给女朋友写了个走迷宫游戏 点击下载并查集迷宫算法JS代码 1 JS代码修改运行方法 首先下载的文件夹如下: 双击打开maze.html文件. 键 ...
- 反汇编算法介绍和应用——递归下降算法分析
上一篇博文我介绍了Windbg使用的线性扫描(linear sweep)反汇编算法.本文我将介绍IDA使用的递归下降(recursive descent)反汇编算法.(转载请指明来源于breaksof ...
- 算法设计与分析——递归与分治策略——全排列
算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...
- c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...
VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...
- js中递归调用返回值为undefined问题
js中递归调用返回值为undefined问题 问题重现 下面这个简单的递归函数 理论上弹出的是11 但是............. 问题解决 在函数调用处加return
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
- 点在多边形内算法,JS判断一个点是否在一个复杂多边形的内部
点在多边形内算法,JS判断一个点是否在一个复杂多边形的内部: function isInPolygon(checkPoint, polygonPoints) {var counter = 0;var ...
- 【算法套路】-【递归篇】【递归三要素】
[算法套路]-[递归篇] 文章目录 [算法套路]-[递归篇] 前言 递归三要素 前言 本文参考·[代码随想录]·大佬的二叉树:一入递归深似海,从此offer是路人,希望在写递归脑子糊涂的时候,给自己一 ...
最新文章
- Cracking The Coding Interview5.2
- Autograd:自动求导
- JavaWeb 入门篇 (5) Cookie 和 Session 详解
- Centos7中yum安装jdk及配置环境变量
- 【知识补充】对称加密、非对称加密、数字签名与DDoS攻击
- 2016年系统集成项目管理工程师最新考试说明
- 淘宝京东卖家可以用到的小工具和素材资源网站
- 虚拟服务器声卡,什么是虚拟声卡?虚拟声卡可以当声卡使用吗?
- spring-boot推送实时日志到前端页面显示
- 百度硬盘邀请码在放送
- 欢迎加新浪微博: weibo.com/zhengkarl
- 我的/etc/motd 卡哇伊内~
- 还原混淆过的stacktrace
- hibernate学习(4)——实体配置详解
- 如果诸葛亮用C#写出师表...
- 使用SolidWorks 导入STEP后,部件的浮动问题
- 数据结构与算法 知识点总结,超全!!!
- windows系统关闭共享文件的三种方式
- matlab ode45指令,matlab 中ode45的源代码如何看懂
- MySQL插入语句优化
热门文章
- 房地产暴利的秘密还鲜为人知(原创首发,深度好文)——何学林中国房地产大策划之五
- cv2,PIL,plt,tensorflow方法图片显示及plt的的plt.colorbar()的使用需要注意
- (C语言)啥?4除以2等于0?
- final 使用详解
- IS_ERR()宏是什么意思
- Tableau 2022.3的Table Extension到底怎么用?
- 插值算法之:拉格朗日插值
- 【VPS折腾记】nextcloud——扩展功能之挂载onedrive(三)
- 为什么Microsoft账号登录显示暂时停用你的账户_苹果手机显示 Apple ID 被停用该如何恢复?...
- python 网格交易源码_Python版简单网格策略