js中递归函数的经典案例
javascript中递归函数的经典案例
什么是递归函数?
关于递归的概念,我们都不陌生。简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。用递归需要注意以下两点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
简洁的来说:一个函数可以调用其他函数。如果函数在内部调用他自己本身 ,那么这个函数就叫递归函数
递归函数的作用:
下面举个例子:计算1~10的累加和1+2+3…+10.
计算1~10的累加和。分析一到十的累加和===>1、add(10)为一到十的累加和;add(10)=10+9+8+7+6+5+4+3+2+1;那我们可不可以写成这样:add(10)=10+add(9);==>同理: add(9)=9+add(8);add(8)=8+add(7);.......add(3)=add(2)+3;add(2)=add(1)+2;add(1)=add(0)+1; 由此我们可以得出:add(n)=add(n-1)+n; add(0)为多少呢?是不是等于0,依次我们可以求的add(1)=1==>即求的add(1)、add(2)、add(3)....add(10)
声明函数如下:
//申明一个add函数function add(n){// 当n==1时写下其边界值为1if(n===1){return 1;}else{ //条件不为1时,调用自身函数return add(n-1)+n; //其关系条件为:add(n)=add(n-1)+n;}}var result = add(10); // 将add为10的值赋值给result;console.log(result); //控制台输出result;
输出结果为:
55
从上面两中方法的对比可以看出,递归函数的作用和循环的方法效果一样,即递归函数本质上是一个方法的循环调用, 注意:有可能会出现死循环。因此,使用递归函数的时候,一定要定义递归的边界(即什么时候退出循环)。
递归函数的另一个案例是斐波纳契数列。
斐波纳契数列:1、1、2、3、5、8、13。。。(该数列中,第三个数开始:数值=前面第一个数字+前面第二个数字)即,n=(n-2)+(n+1)
//综上所述、我们发现以下规律:
fibonacci(n)=fibonacci(n-1)+fibonacci(n-2);
即函数申明如下:
//声明斐波纳契数列函数
function fibonacci(n){//当n==1时值if(n==1){return 1;}//当n==2时值if(n==2){return 1;}return fibonacci(n-1)+fibonacci(n-2);}//返回函数为7赋值给result;var result = fibonacci(7);//控制台输出console.log(result);
输出结果为:
13
以上两个案例是递归的经典案例。
来源于知乎?
递归的三大要素
第一要素:明确你这个函数想要干什么
对于递归,我觉得很重要的一个事就是,这个函数的功能是什么,他要完成什么样的一件事,而这个,是完全由你自己来定义的。也就是说,我们先不管函数里面的代码什么,而是要先明白,你这个函数是要用来干什么。
第二要素:寻找递归结束条件所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。
第三要素:找出函数的等价关系式第三要素就是,我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。例如,f(n) 这个范围比较大,我们可以让 f(n) = n * f(n-1)。这样,范围就由 n 变成了 n-1 了,范围变小了,并且为了原函数f(n) 不变,我们需要让 f(n-1) 乘以 n。说白了,就是要找到原函数的一个等价关系式,f(n) 的等价关系式为 n * f(n-1),即f(n) = n * f(n-1)。
递归的用途
递归一般用于解决三类问题:
(1)问题解法按递归实现。(回溯)
(2)数据的定义是按递归定义的。(Fibonacci函数,n的阶乘)
(3)数据的结构形式是按递归定义的。(二叉树的遍历,图的搜索)
递归的缺点
递归的思想与循环有着类似的思想,但我们很少用,因为其:运行效率较低 、可能出现死循环。 因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。
结语
即我们是不是对递归函数有了一定的理解,那我们如果想要了解更多的前端知识可以打开链接,进入我们的快乐学习之旅!
链接: 前端学习网站.
js中递归函数的经典案例相关推荐
- Python编程经典案例【考题】自由落体运动球的运动轨迹
本文和你一起探索Python编程经典案例,让你沉浸式学习Python.助你期末考试拿高分,拿到大厂的心仪offer.你可以先自己拿着题目去思考有多少种不同的解题方法,然后再对照本文解题方法进行比较.有 ...
- js中实现深拷贝的4种方法
js中深拷贝的方法 原生js中递归函数拷贝 将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据 ,两个对象或数组不共享一块内存 <script>let obj={abc: ...
- Python编程经典案例【考题】求某个范围内能被3整除且能被5整除的所有数,及这些数的和
本文和你一起探索Python编程经典案例,让你沉浸式学习Python.你可以拿着题目先思考,然后再对照本文解题方法进行比较.有不同的见解欢迎到公众号中跟我一起探讨. 文章目录 一.经典案例[考题 ...
- Python编程经典案例【考题】排列组合
本文和你一起探索Python编程经典案例,让你沉浸式学习Python.你可以拿着题目先思考,然后再对照本文解题方法进行比较.有不同的见解欢迎到公众号中跟我一起探讨. 文章目录 一.经典案例[考题] 二 ...
- 让你彻底弄懂Python编程经典案例【考题】之反转一个值
学习Python有很多不同的方法,可以看视频.看博客.看公众号等.但光说不练,很难有快速的提升.最好能动手去处理实际问题,这样才能把学到的知识应用得更熟练. 本文和你一起来探索Python编程的 ...
- Python编程经典案例【考题】公司奖金发放
本文和你一起探索Python编程经典案例,让你沉浸式学习Python.你可以拿着题目先思考,然后再对照本文解题方法进行比较.有不同的见解欢迎到公众号中跟我一起探讨. 文章目录 一.经典案例[考题 ...
- html中js计算百钱百鸡,JS经典案例之百钱百鸡
今天我们来回顾一下JS的经典案例之百钱百鸡 题目 公鸡5元钱一只,母鸡3元钱一只,小鸡3只一元钱,用100元钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100元钱 ...
- python递归函数例子_Python递归函数经典案例-汉诺塔问题
汉诺塔 汉诺塔问题是递归算法学习的一个经典案例,首先来看下汉诺塔问题的相关描述: 汉诺塔问题起源于一个古老的印度传说,大梵天创世时制作了三根金刚石石柱,在第一根柱子上从上往下从小到大摞着64片金盘,婆 ...
- 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】
首先,了解一下循环嵌套的特点:外层循环转一次,内层循环转一圈. 在上一篇随笔中详细介绍了JS中的分支结构和循环结构,我们来简单的回顾一下For循环结构: 1.for循环有三个表达式,分别为: ①定义循 ...
最新文章
- linux 进程数量限制,LINUX下每进程限制线程数量
- 定时器的资源互斥处理
- 数据结构二分法算法的步骤_数据结构与算法之算法思想:二分法搜索实现(python)...
- 【Python基础】使用Matplotlib可视化数据的5个强大技巧
- adb安装apk报错Failure [INSTALL_FAILED_INVALID_URI]
- OSPF-5类LSA和4类LSA
- Java 函数引用 替代方案
- 华为ap配置_13、了解下POE交换机以及AP供电几种方式
- 千亿级数量下日志分析系统的技术架构选型
- java中jdk api等概念的解释
- 【2018盘点VR一体机那些事】手机VR眼镜和VR一体机有什么区别?AR,VR眼镜和VR一体机哪个好?
- 通过docker安装nexus3
- lmdb数据库的读取与转换(一) —— 基本操作
- 程序员面试必看32道经典逻辑推理题
- 网易云信IMweb版集成实现(PHP直接上码)
- 《SQL进阶教程》学习
- 安装opencv时出现PEP517问题解决
- 【随机算法梗概】遗传算法通俗的讲解案例~~
- android友盟微信分享到朋友圈,2020年友盟分享到微信朋友圈
- 2021-2027全球与中国全闪存存储市场现状及未来发展趋势