目录

一、递归定义

百度百科

其他

二、循环与递归

三、几个经典题

斐波那契数

题目

基本思路

递归解法

动态规划解法

汉诺塔

题目

基本思路


一、递归定义

百度百科

递归,就是在运行的过程中调用自己。

函数嵌套调用过程示例

构成递归需具备的条件:

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实现递归相关推荐

  1. 查找和排序算法的js实现

    查找和排序算法的js实现 查找和排序算法的js实现 二分查找(适用于有序述组) 选择排序 快速排序 归并(合并)排序 查找和排序算法的js实现 学习算法时,将算法手写实现,加深记忆. 二分查找(适用于 ...

  2. 第一个算法项目 | JS实现并查集迷宫算法Demo学习

    0 参考链接 并查集,不就一并和一查? 520,花了一夜给女朋友写了个走迷宫游戏 点击下载并查集迷宫算法JS代码 1 JS代码修改运行方法 首先下载的文件夹如下: 双击打开maze.html文件. 键 ...

  3. 反汇编算法介绍和应用——递归下降算法分析

    上一篇博文我介绍了Windbg使用的线性扫描(linear sweep)反汇编算法.本文我将介绍IDA使用的递归下降(recursive descent)反汇编算法.(转载请指明来源于breaksof ...

  4. 算法设计与分析——递归与分治策略——全排列

    算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...

  5. c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...

    VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...

  6. js中递归调用返回值为undefined问题

    js中递归调用返回值为undefined问题 问题重现 下面这个简单的递归函数 理论上弹出的是11 但是............. 问题解决 在函数调用处加return

  7. Python算法:推导、递归和规约

    Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...

  8. 点在多边形内算法,JS判断一个点是否在一个复杂多边形的内部

    点在多边形内算法,JS判断一个点是否在一个复杂多边形的内部: function isInPolygon(checkPoint, polygonPoints) {var counter = 0;var ...

  9. 【算法套路】-【递归篇】【递归三要素】

    [算法套路]-[递归篇] 文章目录 [算法套路]-[递归篇] 前言 递归三要素 前言 本文参考·[代码随想录]·大佬的二叉树:一入递归深似海,从此offer是路人,希望在写递归脑子糊涂的时候,给自己一 ...

最新文章

  1. Cracking The Coding Interview5.2
  2. Autograd:自动求导
  3. JavaWeb 入门篇 (5) Cookie 和 Session 详解
  4. Centos7中yum安装jdk及配置环境变量
  5. 【知识补充】对称加密、非对称加密、数字签名与DDoS攻击
  6. 2016年系统集成项目管理工程师最新考试说明
  7. 淘宝京东卖家可以用到的小工具和素材资源网站
  8. 虚拟服务器声卡,什么是虚拟声卡?虚拟声卡可以当声卡使用吗?
  9. spring-boot推送实时日志到前端页面显示
  10. 百度硬盘邀请码在放送
  11. 欢迎加新浪微博: weibo.com/zhengkarl
  12. 我的/etc/motd 卡哇伊内~
  13. 还原混淆过的stacktrace
  14. hibernate学习(4)——实体配置详解
  15. 如果诸葛亮用C#写出师表...
  16. 使用SolidWorks 导入STEP后,部件的浮动问题
  17. 数据结构与算法 知识点总结,超全!!!
  18. windows系统关闭共享文件的三种方式
  19. matlab ode45指令,matlab 中ode45的源代码如何看懂
  20. MySQL插入语句优化

热门文章

  1. 房地产暴利的秘密还鲜为人知(原创首发,深度好文)——何学林中国房地产大策划之五
  2. cv2,PIL,plt,tensorflow方法图片显示及plt的的plt.colorbar()的使用需要注意
  3. (C语言)啥?4除以2等于0?
  4. final 使用详解
  5. IS_ERR()宏是什么意思
  6. Tableau 2022.3的Table Extension到底怎么用?
  7. 插值算法之:拉格朗日插值
  8. 【VPS折腾记】nextcloud——扩展功能之挂载onedrive(三)
  9. 为什么Microsoft账号登录显示暂时停用你的账户_苹果手机显示 Apple ID 被停用该如何恢复?...
  10. python 网格交易源码_Python版简单网格策略