很多初学者都对递归有很大的迷惑,甚有自己身边的同事对递归多多少少也有一些不解,下面的内容仅代表个人对递归做一些说明理解,仅供参考
1.递归
语法:函数内部自己调用自己
函数调用自己要有结束的时候,不然一直调用内存溢出没有意义
1.1直接形成递归
function test(){
console.log('我是test函数');
test();
}
1.2间接的形成递归
function test1(){
console.log('我是test1函数');
test2();
}
function test2(){
console.log('我是test2()函数');
test1();
}
test1();
/
递归要有结束的时候
var i =0;
function test(){
console.log('哈哈');
i++;
if(i<3){
test();
}
test();
2.递归的执行过程
2.1 函数的调用过程
调用函数一定是会去执行他的函数体的
function test1(){
console.log('哈哈');
console.log('嘻嘻');
test2();
console.log('嘿嘿');
console.log('呵呵');
}
function test2(){
console.log('我是test2+哈哈哈哈');
console.log('我是test2+喜喜喜喜');
}
test1();
输出结果:
哈哈
嘻嘻
我是test2+哈哈哈哈
我是test2+喜喜喜喜
嘿嘿
呵呵
2.2
var i=0;
function test(){
i++;
console.log('哈哈'+i);
if(i<3){
test();
}
console.log('呵呵’+i);
}
test();
输出结果:
哈哈1
哈哈2
哈哈3
呵呵3
呵呵3
呵呵3
为了帮助理解,简单的画了一个图
3.比较经典的几个案例
3.1. 利用递归求1-n之间的整数累加和
function getSum(n){
if(n == 1){
return 1;
}
return getSum(n-1) +n;
}
//类似求整数n的阶乘
3.2 利用递归求斐波那契数列中的第n项
/*1 1 2 3 5 8 13 21 34 55....*/
function getFB(n){
if(n == 1 || n == 2){
return 1;
}
return getFB(n-2)+getFB(n-1);
}
/*使用此方法求递归,会涉及到性能低下的问题?
*1.因为调用这个函数太多次了,调用函数是消耗时间的
*2.因为求了很多重复的项
*/
//关于如何解决这个问题,我会在后面的文章中做一个说明