首页 > 编程知识 正文

js递归函数详解,js递归遍历数组

时间:2023-05-04 04:22:45 阅读:281926 作者:1382

js 递归

首先递归是什么?递归通俗一点讲就是函数直接或间接自己调用自己下面来看例子 function f() { console.log('函数f被调用了!'); f();//函数调用 } f();//函数调用

这就是一个非常典型的递归调用
下面来看一下递归函数的执行过程

但是,注意
这种写法会进入死循环

浏览器会在执行一定次数后报错。
报错原因为:Uncaught RangeError:Maximum call stack size exceeded
翻译成中文为:未捕获范围错误:超出最大调用堆栈大小
所以使用递归函数的时候一定要注意一不小心就会进入死循环

那么怎么解决这个错误呢?
我们可以在函数中加入一个return来退出这个递归函数,以结束死循环,那么return怎么添加呢,这个时候我们就需要判断语句了,在一些特定的条件下return退出函数,这也是递归函数的用法。下面来看例子 var i=0; function f() { console.log('函数f被调用了!'); i++; if(i===10){ return; } f(); } f();


注意:在写递归函数的时候一定要有结束,另外判断语句和return一定要加在函数里面的调用函数前面,不然没有作用
了解了递归函数的基本用法后我们来看看arguments.callee的作用与用法

首先我们来看一段代码 var f=function(x){ if(x===0){ return 1; } return x*f(x-1); } console.log(f(4));

这是一个很简单的用来计算阶乘的递归函数结果如下

var fn=f; f=null; console.log(fn(10));//报错

加上这段代码后就会报错,因为f 已经不是一个函数了那么这种时候我们就需要arguments.callee

arguments.callee 是一个指向正在执行的函数的指针,arguments.callee 返回正在被执行的对现象。

var f=function(x){ if(x===0){ return 1; } return x*arguments.callee(x-1); } console.log(f(10)); var fn=f; f=null; console.log(fn(10));


arguments.callee可以帮助我们更好的进行函数名赋值的操作

下面来看几个递归函数的经典例子 求斐波那契数列 function f(x){ if(x===1||x===2){ return 1; } return f(x-1)+f(x-2); } console.log(f(12));//144

首先先来解释下什么叫做斐波那契数列,斐波那契数列的规律就是第一个与第二个为1 接下来的值为前两个的值相加如:
1 1 2 3 5 8 13 21 34 55 89 144
好了,了解完什么是斐波那契数列后我们在来看看代码的执行过程
首先x=12 然后进行 if 判断 条件错误 然后执行return f(11)+f(10)
x=11 然后进行 if 判断 条件错误 然后执行return f(10)+f(9)
x=10 然后进行 if 判断 条件错误 然后执行return f(9)+f(8)

x=2 进行if 判断 条件成立 返回值为1 所以f(2)的返回值为1.
x=1 进行if 判断 条件成立 返回值为1 所以f(1)的返回值为1
f(3)的返回值 return f(2)+f(1) 为2
f(4)的返回值 return f(3)+f(2) 为3
f(5)的返回值 return f(4)+f(3) 为5
f(6)的返回值 return f(5)+f(4) 为8
f(7)的返回值 return f(6)+f(5) 为13
f(8)的返回值 return f(7)+f(6) 为21
f(9)的返回值 return f(8)+f(7) 为34
f(10)的返回值 return f(9)+f(8) 为55
f(11)的返回值 return f(10)+f(9) 为89
f(12)的返回值 return f(11)+f(10) 为144

2.求x个数字的和

function f(x){ if(x===1){ return 1 } return x+f(x-1) } console.log(f(5))

那么最后我们来总结一下递归的两个重要因素

递归结束条件递归规律

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。