JS复习 -- 递归 红太狼 2022-06-06 06:14 327阅读 0赞 两个很常见的递归函数: // 阶乘 function factorial(n) { if (n == 1) return n; return n * factorial(n - 1) } console.log(factorial(5)) // 5 * 4 * 3 * 2 * 1 = 120 // 斐波那契数列 function fibonacci(n){ return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); } console.log(fibonacci(5)) // 1 1 2 3 5 递归的特点其实就是: 第一,将原始问题拆分,并且拆分得到的子问题和原始问题实现相同的功能。 第二,必须有一个出口让递归函数结束,否则递归将要无限执行。 递归函数存在一个问题: 当JS执行一个函数的时候,就会创建一个执行上下文。然后,这个执行上下文就会被压入执行上下文栈。如果递归不停的调用自身,那么执行上下文栈也就会越来越大。酱紫不太好对吧。 ## 尾调用 ## 这就是解决方案。 尾调用是什么: 指的就是,这个函数的最后一步是执行一个函数,并且,该被执行的函数的返回值就是本函数的返回值。 // 尾调用 function f(x){ return g(x); // 最后一个动作是执行g函数 } // 非尾调用 function f(x){ return g(x) + 1; // 执行g函数后又执行了一步加法 } 那么第一个尾调用的执行上下文变化: // 伪代码 ECStack.push(<f> functionContext); ECStack.pop(); ECStack.push(<g> functionContext); ECStack.pop(); 我们来解释一下,为什么会这样: 因为函数的调用栈还有执行上下文是为了保存函数内部状态的,尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了。 但是,如果函数 g 中用到了f函数中的变量,形成闭包,f 就不会被弹出。 第二个则是: ECStack.push(<f> functionContext); ECStack.push(<g> functionContext); ECStack.pop(); ECStack.pop(); 我们可以看到使用了尾调用的递归函数,在上下文栈中只有一个函数入栈。简直厉害! **函数调用自身,称为递归。如果尾调用自身,就称为尾递归。** ## 优化 ## 下面,我们就来优化刚才的阶乘函数。 function factorial(n, res) { if (n == 1) return res; return factorial(n - 1, n * res) } console.log(factorial(4, 1)) // 24 多了一个参数,不过我们的上下文栈保持了干净。 新技能get了嘛~
相关 js递归(js递归算法) 递归论的基本内容有哪些呢? 任给m,n的值,如果m为0,可由第一式算出;如果m不为0而n为0,可由第二式化归为求g(m,1)的值,这时第一变目减少了;如果m,n均不为0, 超、凢脫俗/ 2023年10月11日 18:48/ 0 赞/ 194 阅读
相关 js递归 ![在这里插入图片描述][20191107111846484.png] 树形结构使用递归算法 ![在这里插入图片描述][2019110711244039.png] 悠悠/ 2023年05月30日 03:54/ 0 赞/ 23 阅读
相关 js 归并算法(递归和非递归) 归并算法时间复杂度是:O(nlogn) 归并递归算法 function merge(left, right)\{ var result=\[\ 怼烎@/ 2023年02月19日 07:27/ 0 赞/ 165 阅读
相关 js递归学习 递归:就是函数自己调用自己本身,或者在自己函数调用的下级函数中调用自己。 递归的两个必要因素: 递归方程,递归结束条件 递归算法的核心: 在有限次可预见性结 梦里梦外;/ 2022年10月12日 12:10/ 0 赞/ 304 阅读
相关 JS复习 -- 递归 两个很常见的递归函数: // 阶乘 function factorial(n) { if (n == 1) return n; 红太狼/ 2022年06月06日 06:14/ 0 赞/ 328 阅读
相关 期末复习——递归与分治策略 【1】阶乘函数 int DiGui(int n) { if(n==0) return 1; retur 偏执的太偏执、/ 2022年06月02日 02:35/ 0 赞/ 317 阅读
相关 js递归 js递归调用 方法一: // 一个简单的阶乘函数 var f = function (x) { if (x === 1) { return 1; } else 女爷i/ 2022年05月21日 11:48/ 0 赞/ 326 阅读
相关 js循环递归函数 var arrayList = { name: '1', children: [{ name: '2', children: [{ 喜欢ヅ旅行/ 2022年04月11日 02:59/ 0 赞/ 380 阅读
相关 js递归 ![ContractedBlock.gif][] ![ExpandedBlockStart.gif][] //使用函数 //弄清函数功能:给一个天数,返回该天 一时失言乱红尘/ 2022年01月07日 07:29/ 0 赞/ 373 阅读
相关 JS递归 JS递归 一、什么是递归 二、递归的作用 1.求阶乘 2.求斐波那契数列 一、什么是递归 函数内部调用自己,这个函数就是递归 港控/mmm°/ 2021年09月07日 06:10/ 0 赞/ 582 阅读
还没有评论,来说两句吧...