js学习小记----递归

今天是2019年的最后一天,大家都去跨年了,自习室就寥寥几个人,今天就把递归给记录下来吧,等什么时候想不起来了还能回头来看看。
什么是递归呢?这个名字起的很高大尚,刚一听感觉好难的样子,我刚开始学递归的时候差不多这个状态,苦思冥想什么是递归,还查了很多资料,但是当你搞明白了之后就会发现其实很简单。
递归就是在一个函数体的内部调用这个函数,这就是递归。下面写一个例子吧,就拿最经典的斐波那契数列:

function fbnq(count) {
				if(count == 0 || count == 1){
					return 1
				}
				else{
				//在这里调用这个函数本身
					return fbnq(count - 1) + fbnq(count - 2);
				}
			}

斐波那契数列的原理就是:比如这是一个斐波那契数列:
1 1 2 3 5 8 13 21 34 怎么求这个数列呢? 设第一个数为 first,第二个数为seconed,第三个数为three,他的原理就是第三个数等于前两个数的和,就拿这个数列来说,2 = 1+1, 3 = 2 + 1, 5 = 3 + 2, 8 = 5 + 3, 13 = 8 + 5,21 = 13 + 8 34 = 21 + 13这里的每一个式子的结果相当于下一个式子的其中一个加数,对应上面的函数,count就相当于这个数列的总和(数列第一个数字索引值是0,最后一个是8,因此count = 8),执行这个函数的时候,return后面第一个函数的count就相当于是7,第二个函数就相当于6,依次类推,当找到出口之后就会在一遍一遍加回来,所以说他效率不高。如果对上面这段话不理解,请看下面的分析:

            1. fbnq(7) + fbnq(6)
			2. fbnq(6) + fbnq(5)    fbnq(5) + fbnq(4)
			3. fbnq(5) + fbnq(4)    fbnq(4) + fbnq(3)  fbnq(3) + fbnq(2)
			4. fbnq(4) + fbnq(3)    fbnq(3) + fbnq(2)  fbnq(3) + fbnq(2)  fbnq(2) + fbnq(1)  fbnq(2) + fbnq(1)  fbnq(1) + fbnq(0);
			fbnq(2) = 2
			fbnq(3) = 3
			fbnq(4) = 5
			fbnq(5) = 8
			fbnq(6) = 13
			fbnq(7) = 21
			fbnq(8) = 34

从上图可以看出来,虽然视觉上看着很简单,实际上内部要实现这样复杂的操作。
使用递归很简单就可以完成斐波那契数列的问题,在使用递归时一定要注意,因为一个处理不当就会陷入死循环,所以使用递归最重要的是要找到那一个出口,在这个例子中return 1就是出口,如果没有这一行代码,就会陷入死循环。如果不用递归求斐波那契数列,而是使用for循环什么的去求肯定比这个复杂。所以递归在很大程度上使函数更加的简洁。
但是使用递归是好的吗? 这是不一定的,虽然视觉上使用递归使函数变得简单了,但是他非常损耗性能,效率很低。因为他要一遍一遍的调用自身,直到找到那一个出口才会结束。
平时可以尽量少用递归来实现一些功能。
如果对您有帮助,点个赞是对我最大的鼓励。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章