您的位置:首页 > Web前端 > JavaScript

JavaScript 递归(栈结构/化归思想)

2017-03-07 12:22 465 查看
递归

(1)概念:函数自己调用自己

(2)问题存在:容易出现死递归,是循环的递归下去,内存不够就报错:栈溢出
//1.直接调用自己
function foo1(){
foo1();
}
foo1();
//2.间接调用自己
function foo2(){
foo3();
}
function foo3(){
foo4();
}
function foo4(){
foo2();
}
foo2();


栈结构

特点:先入后出
function f1(){
f2();
console.log('f1 finish');
}
function f2(){
f3();
console.log('f2 finish');
}
function f3(){
console.log('f3 finish');
}
f1();//f3 finish     f2 finish     f1 finish

//将函数调用称为调用栈


(3)递归要实现需要解决两个问题

1> 停止的条件(解决栈溢出)

2> 如何调用自己

(4) 化归的思想(转化为已归纳好的办法):

对问题进行变形、转化,转换成已经解决的问题,然后直接调用解决好的方法即可。

所谓的递归其实就是化归。

(5)如何写递归?

1> 假设这个问题已经解决,即使写一个空函数也假设已经解决

2> 根据规律(可能要写两到三次),写出化归的表达式,即递归体


3> 确定临界条件

案例:求1,3,5,7,...第n项的值,从0开始
//1> 假设问题已经解决,肯定需要一个函数,带有一个参数,返回一个结果
function foo(n){  }
//2> 要求第n项,根据规律就是 第n-1项 + 2
就是要求 第n-1项,即 foo(n-1) 就是结果
因此得到函数体(递归体)
function foo(n){
return foo(n-1) + 2;
}
//3> 确定临界条件,就是在第0项的时候,值为1
function foo(n){
if(n==0) return 1;
return foo(n-1) + 2;
}


/*
* 练习1:求1,2,4,8,16, ...第n项的值,从0开始
* */
/*1.假设问题已解决,需要一个带参的函数,有返回值*/
function foo(n){
/*3.临界条件:第0项时值为1*/
if(n==0) return 1;
/*2.规律是第n-1项乘以2*/
return foo(n-1)*2;
}
/*
* 练习2:求1到n的和
* */
function foo2(n){
if(n==1) return 1;
return foo2(n-1)+n;
}

/*
* 练习3:fibonacci数列,求第n项
* */
function foo3(n){
if( n==1 || n==2 ) return 1;
return foo3(n-1)+foo3(n-2);
}

/*
* 练习4:求阶乘
* */
function foo4(n){
if(n==1) return 1;
return foo4(n-1)*n;
}

/*
* 练习5:求幂,就是n的m次方
* */
function foo5(n,m){
if(m==0) return 1;
return foo5(n,m-1)*n;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: