问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JavaScript中关于递归与回溯的实例详解

发布网友 发布时间:2024-12-05 01:21

我来回答

1个回答

热心网友 时间:2024-12-09 17:40

递归是一种在程序设计中广泛应用的算法。它通过函数直接或间接地调用自身来解决复杂问题。递归的关键在于将问题简化为一个与原问题相似但规模更小的子问题,从而逐步*近解决方案。为了确保递归能够正常终止,必须设定边界条件。例如,计算1至100的和可以通过循环实现,也可以转换为递归形式:

javascript
function calcNum(n) { let sum = 0 function dfs(n) { if (n > 100) { return } sum += n n++ dfs(n) } dfs(n) return sum }
console.log(calcNum(1)) // 5050

上述代码通过递归逐步求和,直到n超过100为止。回溯则是递归过程的一部分,表现为函数调用栈的撤销。例如,在上述`calcNum`函数中,每次递归调用都会输出当前的n值,而递归返回时,n值会按相反顺序输出。

回溯的概念可以通过二叉树遍历来更好地理解。二叉树的遍历方式包括前序、中序和后序遍历。前序遍历的基本结构如下:

javascript
const treeNode = { val: 1, left: null, right: { val: 2, left: { val: 3, left: null, right: null }, right: null } }

前序遍历的代码实现如下:

javascript
function getRoot(root) { const res = [] function dfs(root) { if (!root) { return } res.push(root.val) dfs(root.left) dfs(root.right) } dfs(root) return res }
console.log(getRoot(root)) // 5 4 1 2 6 7 8

从中序遍历和后序遍历的实现中,可以看出递归的回溯机制在遍历过程中起着关键作用。例如,中序遍历的代码实现如下:

javascript
function getRoot(root) { const res = [] function dfs(root) { if (!root) { return } dfs(root.left) res.push(root.val) dfs(root.right) } dfs(root) return res }
console.log(getRoot(root)) // 1 4 2 5 6 7 8

后序遍历的代码实现如下:

javascript
function getRoot(root) { const res = [] function dfs(root) { if (!root) { return } dfs(root.left) dfs(root.right) res.push(root.val) } dfs(root) return res }
console.log(getRoot(root)) // 1 2 4 7 8 6 5

递归的边界条件确保了递归不会无限执行。例如,在二叉树遍历中,当节点为null时,递归结束。通过这些示例,我们可以看到递归和回溯在解决复杂问题时的强大作用。

实际业务场景中,递归可以用于遍历菜单树或其他树形结构。例如,给定一个树形结构的数据,我们需要遍历每个节点:

javascript
let tree = [ { id: '1', title: '节点1', children: [ { id: '1-1', title: '节点1-1' }, { id: '1-2', title: '节点1-2' } ] }, { id: '2', title: '节点2', children: [ { id: '2-1', title: '节点2-1' } ] } ]

递归遍历节点的代码实现如下:

javascript
function getRootData(tree) { const res = [] function dfs(tree) { if (!tree || tree.length === 0) { return res } for (let i = 0; i tree.length; i++) { const t = tree[i] if (t.children && t.children.length > 0) { dfs(t.children) } else { res.push(t.title) } } } dfs(tree) return res }
console.log(getRootData(tree)) // ['节点1-1', '节点1-2', '节点2-1']

回溯的应用还包括寻找节点的所有父节点。例如,给定一个节点的id,我们需要找到其所有父节点的路径:

javascript
const tree = [ { id: '1', title: '节点1', children: [ {id: '1-1',title: '节点1-1' }, {id: '1-2',title: '节点1-2' } ] }, { id: '2', title: '节点2', children: [ {id: '2-1',title: '节点2-1',children: [ { id: '2-1-1', title: '节点2-1-1' }] } ] } ]

递归查找路径的代码实现如下:

javascript
function pathTree(tree, id) { const res = [] function dfs(tree, path) { if (!tree || tree.length === 0) { return } for (let i = 0; i tree.length; i++) { const t = tree[i] path.push(t.id) if (path.includes(id)) { res.push(path.slice()) } if (t.children && t.children.length > 0) { dfs(t.children, path) } path.pop() } } dfs(tree, []) return res }
console.log(pathTree(tree, '2-1-1')) // [2,2-1,2-1-1]

递归中的`path.pop()`操作用于回溯,确保路径返回到正确的状态。这在处理组合问题时尤为重要,例如从1到4的数字中选择2个数的所有组合:

javascript
function combine(n, k) { const res = [] function dfs(n, path, startIndex) { if (path.length === k) { res.push(path.slice()) return } for (let i = startIndex; i <= n; i++) { path.push(i) dfs(n, path, i + 1) path.pop() } } dfs(n, [], 1) return res }
console.log(combine(4, 2)) // [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]

通过递归和回溯,我们可以有效地解决复杂问题。递归不仅简化了代码,还提供了清晰的问题解决思路。希望这些示例能够帮助你更好地理解和应用递归和回溯。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
初中英语语法讲解:名词所有格 关于名词所有格一问 暗区突围画面怎么设置最好-暗区突围画面设置推荐 暗区突围打开的箱子怎么关上 保险箱关闭攻略 暗区突围 暗区突围画面设置怎么弄最佳? 暗区突围 暗区突围光影怎么调? 暗区突围 暗区突围中间白点怎么设置? 暗区突围灵敏度怎么调最稳 暗区突围灵敏度最佳设置方法 我的WIN7 64位系统无法安装打印机HP1136,请支持啊,急。驱动下载也没用... win7电脑连接不上惠普打印机Win7系统安装不了惠普HP1007打印机 天财商龙餐饮收银系统怎么结班 商龙云2.0新功能发布!天财商龙为餐饮管理再助力! 天财商龙云供应链门店自采入库怎么审核 关于天财商龙的盘点表如何导入 天财点单系统怎样加产品 三国演义中的精彩语录 历史上真的有百万军中取上将首级吗,这几位万人敌其实 吾弟张翼德百万军中去上将首级如探囊去物一般多少回说的叫什么名字_百... 国际中文教师和国际汉语教师区别 中国法律现代化的路径分析作者简介 姜涛主要研究 高等院校法学专业民商法系列教材•婚姻家庭法作者简介 王利荣学术地位 对外经济贸易大学法学院卢海君博士的学术成果概况? 新型合同纠纷的预防解决与审判实务作者简介 卢海君的学术成果丰硕,有哪些著作和论文发表在核心刊物上? 胡仁智西南政法大学行政法学院教授 ...15%的40千克盐水中蒸发一定的水分,得到含盐20%的盐水,应当蒸发... ...%的80克盐水中蒸去水分,制成含盐20%的盐水,应蒸去___克水 浓度的知识及应用题 用javascript编写一段程序,计算1到1000之间所有整数的和,并显示结果... 2、使用递归完成1到100的累加 javascript中使用循环语句,编程求解1到100之间的素数之和. 怎样用JavaScript求出从1加到100的结果?并alert出来。谢谢 epc亮黄灯车抖动 请问有冇人知道韩剧豪杰春香, 梦龙的同学为他们搅结婚庆祝party唱的... 改燃气管道价格 五菱荣光暖水箱两根管朝上还是朝下 "兴亡天下三分局,古今人思五丈原"""' 水印相机是黄钻特权吗? qq空间的水印相机使用需要是黄钻吗? 水印相机黄钻用户的特权是什么? 水印相机里面的水印非黄钻用户可以用?? 黄钻用户使用水印相机有什么特权?有哪些。 甲午风云旧年事是什么意思 方伯谦的意思方伯谦的意思是什么 我是2011年4月份考的浙江省教师资格证,考教育学心理学,那试讲时间什么... 教师资格证笔试内容题型有哪些 ...操作项目是:凿岩机司机。这证可不可以开挖掘 烟台62路公交车路线,到佳时客在哪里下车?