摘要:递归原理之先看以下代码打开浏览器断点调试,观看执行过程代码执行过程此时函数开始向上回溯将代码修改一下每次将返回代码执行过程此时函数开始向上回溯总结所以在递归过程中,如果递归依赖上一次递归的结果,需要将结果。
js递归原理之return
先看以下代码:
var a = 1; function multiply(n) { if (n <= 1) { return 1; } a = n * multiply(n - 1); console.log("n:" + n); console.log("a:" + a); } console.log(multiply(5))
打开chrome浏览器断点调试,观看js执行过程
//代码执行过程 a=n*multiply(n-1)//n=5 a=1 a=n*multiply(n-1)//n=4 a=1 a=n*multiply(n-1)//n=3 a=1 a=n*multiply(n-1)//n=2 a=1 a=n*multiply(n-1)//n=1 a=1 return 1 //此时函数开始向上回溯 a=n*multiply(n-1)//n=2 a=2*1=2 console.log("n:"+n)//n:2 console.log("a:"+a)//a:2 return undefined a=n*multiply(n-1)//n=3 a=3*undefined=NaN console.log("n:"+n)//n:3 console.log("a:"+a)//a:NaN return undefined a=n*multiply(n-1)//n=4 a=4*undefined=NaN console.log("n:"+n)//n:4 console.log("a:"+a)//a:NaN return undefined a=n*multiply(n-1)//n=5 a=5*undefined=NaN console.log("n:"+n)//n:5 console.log("a:"+a)//a:NaN return undefined
将代码修改一下:
var a = 1; function multiply(n) { if (n <= 1) { return 1; } a = n * multiply(n - 1); console.log("n:" + n); console.log("a:" + a); return a;//每次将a返回 } console.log(multiply(5))
//代码执行过程 a=n*multiply(n-1)//n=5 a=1 a=n*multiply(n-1)//n=4 a=1 a=n*multiply(n-1)//n=3 a=1 a=n*multiply(n-1)//n=2 a=1 a=n*multiply(n-1)//n=1 a=1 return 1 //此时函数开始向上回溯 a=n*multiply(n-1)//n=2 a=2*1=2 console.log("n:"+n)//n:2 console.log("a:"+a)//a:2 return 2 a=n*multiply(n-1)//n=3 a=3*2=6 console.log("n:"+n)//n:3 console.log("a:"+a)//a:6 return 6 a=n*multiply(n-1)//n=4 a=4*6=24 console.log("n:"+n)//n:4 console.log("a:"+a)//a:24 return 24 a=n*multiply(n-1)//n=5 a=5*24=120 console.log("n:"+n)//n:5 console.log("a:"+a)//a:120 return 120
总结:
所以在递归过程中,如果递归依赖上一次递归的结果,需要将结果return。
如果不需要上一次的结果,就不需要return。
所以示例代码的正确写法是:
function multiply(n) { if (n <= 1) { return 1; } return n * multiply(n - 1); }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/107065.html
摘要:今天这篇文章我们来看看一道必会面试题,即如何实现一个深拷贝。木易杨注意这里使用上面测试用例测试一下一个简单的深拷贝就完成了,但是这个实现还存在很多问题。 引言 上篇文章详细介绍了浅拷贝 Object.assign,并对其进行了模拟实现,在实现的过程中,介绍了很多基础知识。今天这篇文章我们来看看一道必会面试题,即如何实现一个深拷贝。本文会详细介绍对象、数组、循环引用、引用丢失、Symbo...
摘要:算法之深度优先遍历和广度优先遍历背景在开发页面的时候,我们有时候会遇到这种需求在页面某个节点中遍历,找到目标节点,我们正常做法是利用选择器,或者,但在本文,我们从算法的角度去查找节点,同时理解一下深度优先遍历和广度优先遍历的原理。 JS算法之深度优先遍历(DFS)和广度优先遍历(BFS) 背景 在开发页面的时候,我们有时候会遇到这种需求:在页面某个dom节点中遍历,找到目标dom节点,...
摘要:前言在计算机领域,记忆是主要用于加速程序计算的一种优化技术,它使得函数避免重复演算之前已被处理过的输入,而返回已缓存的结果。被执行了不是素数,其他数字默认是素数。我们可以看出,如果从开始打印斐波那契数列,函数被执行了次。 前言 在计算机领域,记忆(memoization)是主要用于加速程序计算的一种优化技术,它使得函数避免重复演算之前已被处理过的输入,而返回已缓存的结果。 -- wi...
摘要:实现代码判断参数是否是一个数组递归出口数组长度为,直接返回数组数组元素有多个,则定义两个数组循环遍历数组,把第一个元素当做比较的对象判断当前元素的大小递归调用将所有的结果合并 原理:找到当前数组中的任意一个元素(一般选择第一个元素),作为标准,新建两个空数组left、rignt,遍历整个数组元素,如果遍历到的元素比当前的元素小就放到数组left,比当前的元素大放到rignt,然后再对新...
阅读 1597·2021-11-02 14:42
阅读 492·2021-10-18 13:24
阅读 890·2021-10-12 10:12
阅读 1780·2021-09-02 15:41
阅读 3160·2019-08-30 15:56
阅读 2861·2019-08-29 16:09
阅读 2012·2019-08-29 11:13
阅读 3587·2019-08-28 18:06