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时写下其边界值为1
if(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)数据的结构形式是按递归定义的。(二叉树的遍历,图的搜索)
递归的缺点
递归的思想与循环有着类似的思想,但我们很少用,因为其:运行效率较低 、可能出现死循环。 因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。
结语
即我们是不是对递归函数有了一定的理解,那我们如果想要了解更多的前端知识可以打开链接,进入我们的快乐学习之旅!
链接: 前端学习网站.
本文地址:https://blog.csdn.net/yzhlove_cs/article/details/107280178
上一篇: 初识CSS总结
下一篇: 用原生js-对ajax封装