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)数据的结构形式是按递归定义的。(二叉树的遍历,图的搜索)

递归的缺点

递归的思想与循环有着类似的思想,但我们很少用,因为其:运行效率较低可能出现死循环。 因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。

结语

即我们是不是对递归函数有了一定的理解,那我们如果想要了解更多的前端知识可以打开链接,进入我们的快乐学习之旅!
链接: 前端学习网站.

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值