搜索
您的当前位置:首页正文

JS的递归实现方法

2023-11-30 来源:谷彼宠物网

这次给大家带来,的注意事项有哪些,下面就是实战案例,一起来看一下。

递归函数:递归函数是在通过名字调用自身的情况下构成的。

递归实现阶乘函数:

方法一:通过使用函数的名字

 function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } console.log(factorial(4));

结果为:24;

但是这种方法实现递归有一个问题,观察以下代码:

function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } var anthorFactorial=factorial; console.log(anthorFactorial(4));

结果为:24;

但是:

function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } } var anthorFactorial=factorial; factorial=null; console.log(anthorFactorial(4));

结果为:报错

这是因为:

我们定义的函数名,其实是指向函数的一个指针,定义的anotherFactorial 也指向了那个函数,所以调用anotherFactorial (4)可以成功的输出24

当 factorial = null时,执行定义函数的引用就剩下了anotherFactorial,那么在调用anotherFactorial(4)就会显示以上的错误的信息。

此时可以使用arguments.callee来替代函数定义中的 factorial。

方法二:通过使用arguments.callee

function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } var anthorFactorial=factorial; factorial=null; console.log(anthorFactorial(4));

结果为:24

arguments.callee是一个指向正在执行的函数的指针,因此可以用arguments.callee来实现对函数的递归调用。通过使用arguments.callee来代替函数名,可以保证在调用函数时无论怎样都不会出现问题。因此,在编写递归函数时,使用argumnts.callee总比使用函数名更加保险。 但是,在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会报错,不过可以通过命名函数表达式来达到相同的效果。

方法三:通过命名函数表达式

 var factorial=function f(num){ if(num<=1){ return 1; }else{ return num*f(num-1); } }; f=null; console.log(factorial(4));

这种方式在严格和非严格模式下都有效。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

小编还为您整理了以下内容,可能对您也有帮助:

js实现递归算法

<!DOCTYPE >

<html>

<head>

<meta content="" charset="utf-8">

<title>函数的递归调用</title>

</head>

<body>

<script>

//递归的概念:自己调用自己

//注意:使用递归的时候必须有一个结束标志,否则会报内存溢出的错误 Maximum call stack size exceeded;

/* 1.案例一:求1,2,3...n 的和 */

function fn(n){

if(n===1){

return 1;

}

return n+fn(n-1);

}

//console.log(fn(3));

/* 2.案例二:求1,2,3...到n的阶乘 */

function getFactorial(n){

if(n===1){

return 1;

}

return n * getFactorial(n-1);

}

//console.log(getFactorial(3));

/* 案例三:斐波那契数列 *///第n个数等于前两个数的和,除第一个数跟第二个树外:如1,1,2,3,5,8,11,19,30...

function getNFibonacciSequence(n){

if(n===1 || n===2){

return 1;

}

return getNFibonacciSequence(n-1)+getNFibonacciSequence(n-2);

}

console.log(getNFibonacciSequence(4));

</script>

</body>

</html>

js-递归方法

首先先解释一下什么是递归函数:什么是递归方法:就是一个方法,自己调用自己

但是一定要注意控制好合适的跳出,不然就会死循环,如图:

所以我们平时一定要注意,递归函数里调用函数本身的时候一定要要合理的控制循环跳出的语句;比如我们来看一题很经典的面试题,请用递归方法算出1-20之间每个数的和

 function calc(num){

            //这个if是退出递归的条件

            if(num===1) {    //如果没有这个if条件

                return num

            }

            return num + calc(num-1)  //

        }

console.log(calc(3))  //这里为了方便我们理解我们可以先用num===3替代进去,具体的方式以及步骤分解可以看图:

如果有大佬有更好的理解方法,可以留言或者私信哦,互相学习,互相进步~~~

JS递归的常见用法

求 1-100 的和

1,1,2,3,5,8,13,21,34,55,89...求第 n 项

JS 递归 假如楼梯有 n 个台阶,每次可以走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法

原理: clone(o) = new Object; 返回一个对象

1、很多时候可以用递归代替循环,可以理解为递归是一种特殊的循环,但通常情况下不推荐这样做。
2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。
3、递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。
4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步的回调里面,调用自己来实现每次都能拿到异步的结果再进行其他操作。
5、递归实现的快速排序比普通遍历实现的排序效率更好。

JS递归的常见用法

求 1-100 的和

1,1,2,3,5,8,13,21,34,55,89...求第 n 项

JS 递归 假如楼梯有 n 个台阶,每次可以走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法

原理: clone(o) = new Object; 返回一个对象

1、很多时候可以用递归代替循环,可以理解为递归是一种特殊的循环,但通常情况下不推荐这样做。
2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。
3、递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。
4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步的回调里面,调用自己来实现每次都能拿到异步的结果再进行其他操作。
5、递归实现的快速排序比普通遍历实现的排序效率更好。

javascript 中的递归优化方法有哪些?

1. 尾递归优化:将递归调用转换为循环,避免在调用栈中产生大量的临时变量。

2. 记忆化(Memoization):将已经计算过的结果存储起来,避免重复计算。

3. 循环代替递归:对于一些可以用循环实现的问题,尽量避免使用递归。

4. 分治策略:将问题分解为更小的子问题,然后递归求解子问题,最后合并子问题的解。

5. 动态规划(DP):通过将子问题的解存储起来,避免重复计算。

6. 使用迭代代替递归:对于一些可以使用迭代实现的问题,尽量避免使用递归。

js的promise如何递归调用?

递归是Promise机制的核心之一:then方法返回另一个promise2,其内容是由回调方法的返回值决定的;回调中可以返回promise3,使外面的promise2的内容成为promise3的内容,也就是说,如果要用promise来递归,只需要在then回调中返回递归promise即可

举例如下:

//假如用jQuery

function get(url, p) {

return $.get(url + "?page=" + p)

.then(function(data) {

if(!data.list.length) {//递归结束条件

return [];

}

return get(url, p+1)//递归调用

.then(function(nextList) {

return [].concat(data.list, nextList);//合并递归内容

});

});

}

get("urlurl", 1).then(function(list) {

console.log(list);//your full list is here

});

谷彼宠物网还为您提供以下相关内容希望对您有帮助:

js实现递归算法

//递归的概念:自己调用自己 //注意:使用递归的时候必须有一个结束标志,否则会报内存溢出的错误 Maximum call stack size exceeded;/* 1.案例一:求1,2,3...n 的和 */ function fn(n){ if(n===1){ return ...

js如何实现递归函数

当一个函数调用自身时,就称为递归函数,例 function demo(x) { if (x &lt; 0) return; if (x === 0) return 1; return x * demo(x - 1);}console.log(demo(3));输出结果为:6从上面的例子可以看出在retur...

js-递归方法

所以我们平时一定要注意,递归函数里调用函数本身的时候一定要要合理的控制循环跳出的语句;比如我们来看一题很经典的面试题,请用递归方法算出1-20之间每个数的和  function calc(num){       ...

JS递归的常见用法

2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。3、递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步...

求js用递归实现婓那波契数列

function count(n){ if(!n || n &lt; 2){ n=2; // 婓那波契数列从第三项开始,等于前二项之和 } if(n &gt; 20){ // 限制计算到20级,避免死循环。document.getElementById("a5").value=aa;return;} arr=aa....

js树状结构进入子级后怎么返回?

在JS中,如果要从子级返回到父级,可以通过以下几种方式实现:1.使用递归:在进入子级之前,记录下当前层级的信息,然后递归调用自身,直到没有子级为止。当退出子级时,使用保存的信息返回到上一层级。例如:function ...

用js 实现递归树形结构菜单 根节点id=CustomerId,pID=PCustomer_百度知 ...

用js 实现递归树形结构菜单 根节点id=CustomerId,pID=PCustomer 50 treeview=[{id:"CustomerId",text:"Customer",children:[{id:'SLA',text:'SLA',children:[]},{id:'Contract',text:'Contract',children:[]},{id:'...

JS函数式编程和递归探索:路由树的操作

现在,我们创建addRouteMetaKey函数,该函数对路由树进行递归遍历,为每一个路由配置的meta属性动态添加key字段。这个函数很简单,属于最基础的递归使用例子,我就不做太多解释了。提示 :数组的forEach方法不是纯函数,因为它...

javascript 中的递归优化方法有哪些?

1. 尾递归优化:将递归调用转换为循环,避免在调用栈中产生大量的临时变量。2. 记忆化(Memoization):将已经计算过的结果存储起来,避免重复计算。3. 循环代替递归:对于一些可以用循环实现的问题,尽量避免使用递归。4. ...

js树形结构如何从最深层往上匹配

1、递归实现 function treeIterator(tree, func) { tree.forEach((node) =&gt; { func(node)node.children &amp;&amp; treeIterator(node.children, func)})} 实现逻辑简述:定义treeIterator函数,传入tree(树)和func(回调函数)...

Top