递归,简单地说,就是在自身上调用一个函数。它可以用来将复杂的问题分解成更小的可管理的类似单元,这些单元可以由同一个函数处理。递归与迭代迭代函数是一种循环重复代码的某些部分的函数,而递归函数是一种再次调用自身的函数重复代码。例如,要计算数字数组的总和函数iterativeSum(arr){letsum=0;for(letiofarr){sum+=i;}returnsum;}functionrecursiveSum(arr){if(arr.length===0){return0;}returnarr[0]+recursiveSum(arr.slice(1));}/****iterativeSum([1,2,3])=>1+2+3=>6**recursiveSum([1,2,3])*=>1+递归和([2,3])*=>2+递归和([3])*=>3+递归和([])*=>0*=>0+3+2+1=>6*/console.log(iterativeSum([1,2,3]));//6console.log(递归求和([1,2,3]));//6如何使用递归basecondition是必须的使用递归没有basecondition会导致无限递归。由于递归是在自身上调用函数,基本条件指示何时终止进程。functioninfiniteRecursion(){//不断调用自身而不终止returninfiniteRecursion();}将问题分解为函数可以处理的较小单元本身。例如,数组的总和=第一个元素的值+数组其余元素的总和。这就是我们在上面的递归求和示例中递归地执行它的方式。实践使完美Q1问题:从数字1开始,重复添加5或乘以3,可以产生无限多的新数字。编写一个函数,给定一个数字,尝试找到产生该数字的此类加法和乘法的序列。思想:要找到数字的解决方案(我们称之为A),我们尝试将5加或乘以3到currentnumber(我们称它为B)并使用递归来检查是否有结果的解决方案(即B+5或B*3)。基本条件是当前数字大于(boom!)或等于(找到解决方案!);//砰!}elseif(start===num){返回历史;//找到解决方案}returnfind(start+5,`(${history}+5)`)||查找(开始*3,`(${history}*3)`);}returnfind(1,'1');}console.log(findSolution(13));//(((1*3)+5)+5)console.log(findSolution(20));//nullQ2Question:Inorder(Left,Right,Top)遍历二叉树SolutionclassNode{constructor(value,left=null,right=null){this.value=value;this.left=左;this.right=正确;}}functioninorder(node,fn){if(node==null){返回;}inorder(node.left,fn);fn(节点);inorder(node.right,fn);}functiontest(){/***A*/\*BC*/\\*EFH*/让E=newNode('E'),F=newNode('F'),H=newNode('H'),B=newNode('B',E,F),C=newNode('C',null,H),A=newNode('A',B,C);inorder(A,node=>console.log(node.value));//EBFACH}test();ReferenceEloquentJavaScriptNotice如果您想关注系列阅读笔记的最新消息/文章,请「观看」订阅。
