回溯对于开发人员的重要性

定义

回溯是所有编程语言中使用的一种方法,用于探索问题的所有可能结果。
它可以应用于解决迷宫中寻找路径、解决 n 皇后问题、数独等问题。

为什么有用?

为什么回溯对于开发者来说很有价值?
想象一下有多种可能结果可供探索的情况。我们有时间手动检查每一种可能性吗?显然不是。
我们可能会考虑创建一个大循环来遍历所有潜在的解决方案。但每台机器的能力都能处理如此繁重的工作吗?再说一次,不。

这就是回溯派上用场的地方。带着这个理念,我们系统地尝试每一种可能的解决方案。如果一种解决方案不起作用,我们会返回并尝试另一种解决方案,直到满足我们定义的成功条件为止。

类比

以数独为例:
每行必须包含 1 到 9 的数字。
每列必须包含 1 到 9 的数字。
9个子网格(3*3​​)中的每一个都必须包含从1到9的数字。

解决数独谜题时,需要填充空白区域。解决方法

我们创建一个函数来检查一个数字是否满足所有规则。确认是否可以输入号码后,我们继续检查剩余空位的可能性。如果输入的数字稍后会导致无效的解决方案,我们会回溯,尝试另一个数字,然后重复该过程。

这会一直持续,直到所有空格都被正确填充并解决谜题。

回溯的主要步骤

选择:找出每一步所有可能的解决方案,并一一检查。约束:根据规则验证解是否有效。目标:确定解决方案是否满足所有条件。后退:当解决方案失败时回溯并探索其他选项。

示例代码:使用 javascript 通过回溯求解数独

//We start with a partially filled Sudoku board (for empty cells) and we want to find the possible numbers that can be used to fill the boardconst board = [    ["5", "3", ".", "6", "7", "8", "9", "1", "2"],    ["6", "7", "2", "1", "9", "5", "3", "4", "8"],    ["1", "9", "8", "3", "4", "2", "5", "6", "7"],    ["8", "5", "9", "7", "6", "1", "4", "2", "3"],    ["4", "2", "6", "8", ".", "3", "7", "9", "1"],    ["7", "1", "3", "9", "2", "4", "8", "5", "6"],    ["9", "6", "1", "5", "3", "7", "2", "8", "4"],    ["2", "8", "7", "4", "1", "9", "6", "3", "5"],    ["3", "4", "5", "2", "8", "6", "1", ".", "9"]];//'.' represents an empty cell// Possible numbers for Sudokuconst possibleNumbers = ["1", "2", "3", "4", "5", "6", "7", "8", "9"];// Function to check if placing a number is validfunction isValid(number, row, col, board) {    // Check row and column    for (let i = 0; i < board.length; i++) {        if (board[row][i] === number || board[i][col] === number) {            return false;        }    }    // Check the 3x3 sub-grid    let startRow = Math.floor(row / 3) * 3;    let startCol = Math.floor(col / 3) * 3;    for (let i = startRow; i < startRow + 3; i++) {        for (let j = startCol; j < startCol + 3; j++) {            if (board[i][j] === number) {                return false;            }        }    }    return true; // The number is valid for this position}// Function to solve the Sudoku boardfunction solveSudoku(board) {    const emptySpaces = [];    // Find all empty spaces on the board    for (let i = 0; i < 9; i++) {        for (let j = 0; j = emptySpaces.length) {            return true; // All spaces filled successfully        }        const { row, col } = emptySpaces[emptySpaceIndex];        for (let i = 0; i < possibleNumbers.length; i++) {            const num = possibleNumbers[i];            if (isValid(num, row, col, board)) {                board[row][col] = num; // Place the number                if (recurse(emptySpaceIndex + 1)) {                    return true; // Solution found                }                // Backtrack if placing the number doesn't lead to a solution                board[row][col] = ".";            }        }        return false; // No valid number found for this position    }    recurse(0); // Start solving from the first empty space    return board;}// Solve the Sudoku puzzlesolveSudoku(board);console.log(board);

要点

回溯系统地探索所有可能性,同时遵守约束。
它对于解决基于约束的问题(例如数独、n 皇后等)特别有用。
回溯的递归性质使我们能够在解决方案失败时后退一步并尝试替代路径。

希望您对我的文章感到满意。我会在那里回答您可能提出的所有问题。
如果满意的话就留下一个♥️(其实意义很大)

图片:图片来自 freepik 上的 storyset

以上就是回溯对于开发人员的重要性的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1500848.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 22:54:14
下一篇 2025年12月19日 22:54:29

相关推荐

  • CSS mask属性无法获取图片:为什么我的图片不见了?

    CSS mask属性无法获取图片 在使用CSS mask属性时,可能会遇到无法获取指定照片的情况。这个问题通常表现为: 网络面板中没有请求图片:尽管CSS代码中指定了图片地址,但网络面板中却找不到图片的请求记录。 问题原因: 此问题的可能原因是浏览器的兼容性问题。某些较旧版本的浏览器可能不支持CSS…

    2025年12月24日
    900
  • 为什么设置 `overflow: hidden` 会导致 `inline-block` 元素错位?

    overflow 导致 inline-block 元素错位解析 当多个 inline-block 元素并列排列时,可能会出现错位显示的问题。这通常是由于其中一个元素设置了 overflow 属性引起的。 问题现象 在不设置 overflow 属性时,元素按预期显示在同一水平线上: 不设置 overf…

    2025年12月24日 好文分享
    400
  • 网页使用本地字体:为什么 CSS 代码中明明指定了“荆南麦圆体”,页面却仍然显示“微软雅黑”?

    网页中使用本地字体 本文将解答如何将本地安装字体应用到网页中,避免使用 src 属性直接引入字体文件。 问题: 想要在网页上使用已安装的“荆南麦圆体”字体,但 css 代码中将其置于第一位的“font-family”属性,页面仍显示“微软雅黑”字体。 立即学习“前端免费学习笔记(深入)”; 答案: …

    2025年12月24日
    000
  • 为什么我的特定 DIV 在 Edge 浏览器中无法显示?

    特定 DIV 无法显示:用户代理样式表的困扰 当你在 Edge 浏览器中打开项目中的某个 div 时,却发现它无法正常显示,仔细检查样式后,发现是由用户代理样式表中的 display none 引起的。但你疑问的是,为什么会出现这样的样式表,而且只针对特定的 div? 背后的原因 用户代理样式表是由…

    2025年12月24日
    200
  • inline-block元素错位了,是为什么?

    inline-block元素错位背后的原因 inline-block元素是一种特殊类型的块级元素,它可以与其他元素行内排列。但是,在某些情况下,inline-block元素可能会出现错位显示的问题。 错位的原因 当inline-block元素设置了overflow:hidden属性时,它会影响元素的…

    2025年12月24日
    000
  • 为什么 CSS mask 属性未请求指定图片?

    解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…

    2025年12月24日
    200
  • 为什么使用 inline-block 元素时会错位?

    inline-block 元素错位成因剖析 在使用 inline-block 元素时,可能会遇到它们错位显示的问题。如代码 demo 所示,当设置了 overflow 属性时,a 标签就会错位下沉,而未设置时却不会。 问题根源: overflow:hidden 属性影响了 inline-block …

    2025年12月24日
    000
  • 为什么我的 CSS 元素放大效果无法正常生效?

    css 设置元素放大效果的疑问解答 原提问者在尝试给元素添加 10em 字体大小和过渡效果后,未能在进入页面时看到放大效果。探究发现,原提问者将 CSS 代码直接写在页面中,导致放大效果无法触发。 解决办法如下: 将 CSS 样式写在一个单独的文件中,并使用 标签引入该样式文件。这个操作与原提问者观…

    2025年12月24日
    000
  • 为什么我的 em 和 transition 设置后元素没有放大?

    元素设置 em 和 transition 后不放大 一个 youtube 视频中展示了设置 em 和 transition 的元素在页面加载后会放大,但同样的代码在提问者电脑上没有达到预期效果。 可能原因: 问题在于 css 代码的位置。在视频中,css 被放置在单独的文件中并通过 link 标签引…

    2025年12月24日
    100
  • 为什么在父元素为inline或inline-block时,子元素设置width: 100%会出现不同的显示效果?

    width:100%在父元素为inline或inline-block下的显示问题 问题提出 当父元素为inline或inline-block时,内部元素设置width:100%会出现不同的显示效果。以代码为例: 测试内容 这是inline-block span 效果1:父元素为inline-bloc…

    2025年12月24日
    400
  • CSS 中的网格和 Flex 布局

    介绍 flexbox 和网格布局都是强大的布局。 弹性盒: flexbox 是一种一维布局模型,最适合在单行或单列中排列元素。当元素的大小或容器的大小未知时,flexbox 特别有用。它非常适合水平和垂直对齐项目,并且对于创建导航栏、侧边栏或工具栏非常有用。 css 网格: 网格是一种二维布局模型,…

    2025年12月24日
    000
  • 黏性定位的失效原因及解决方法

    粘性定位为什么会失效?原因及解决方法 一、引言在前端开发中,粘性定位(sticky position)是一种常见的布局方式。通过设置元素的定位属性为sticky,可以实现在指定的滚动范围内,元素在页面上的位置保持固定不变,直到达到指定的偏移量。然而,有时候我们会发现粘性定位失效的情况,本文将探讨其原…

    2025年12月24日
    000
  • 分析与解决绝对定位故障的原因

    绝对定位故障的原因分析及解决方法 概述:绝对定位是前端开发中常见的一种布局方式,它可以让元素在页面中精确地定位。但是,在实际的开发过程中,我们可能会遇到绝对定位出现故障的情况。本文将分析绝对定位故障的原因,并提供解决方法,同时附上具体的代码示例。 一、原因分析: 定位元素和参照元素的父元素未设置定位…

    2025年12月24日
    000
  • CSS主框架偏移的原因及解决方法推导

    解析CSS主框架偏移的原因及解决方法,需要具体代码示例 标题:CSS主框架偏移问题的分析与解决方案 引言:随着Web开发的不断发展,CSS作为前端开发的重要工具之一,被广泛应用于页面布局和样式设计。然而,在实际开发中,我们可能会遇到CSS主框架偏移的问题,即页面元素无法按预期位置显示。本文将深入分析…

    2025年12月24日
    200
  • CSS中IE浏览器最基本的一些bug以及解决方法

    css如何解决bug?相信有很多刚刚接触css中ie浏览器的朋友都会有这样的疑问。本章就给大家介绍css中ie浏览器最基本的一些bug以及解决方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 一、IE6双倍边距bug 当页面上的元素使用float浮动时,不管是向左还是向右浮动;…

    2025年12月24日
    300
  • html5怎么引用图标_html5用iconfont或img标签引用图标文件显示【引用】

    HTML5图标显示异常可因路径错误、引用不当或字体未加载,解决方法包括:一、用iconfont类名引用;二、用Unicode字符引用;三、用img标签引用位图;四、内联SVG图标;五、预加载字体文件。 如果您在HTML5页面中需要显示图标,但图标无法正常加载或显示效果不符合预期,则可能是由于图标文件…

    2025年12月23日
    000
  • html5怎么指定路径_HTML5用相对或绝对路径指定图片视频等资源位置【指定】

    HTML5资源无法显示通常因路径错误,解决方法包括:一、相对路径(如src=”images/logo.png”);二、绝对路径(如src=”/media/video.mp4″);三、data URL内联小资源;四、base标签统一基准路径;五、避免fi…

    2025年12月23日
    000
  • html5图片怎么显示_HTML5用img标签src引图或CSS背景图显示图片【显示】

    HTML5图片显示异常的五种解决方法:一、用img标签配src/alt属性;二、用CSS background-image设背景图;三、用picture+source实现响应式切换;四、内联SVG代码嵌入矢量图;五、用data URL嵌入小图Base64编码。 如果您在HTML5页面中插入图片但无法…

    2025年12月23日
    000
  • html如何加载视频_html视频加载设置【教程】

    视频无法加载的解决方法包括:一、基础设置,用标签配src、controls、preload等属性;二、多格式适配,嵌套多个标签并声明type;三、懒加载,用loading=”lazy”并避免布局偏移;四、跨域配置,添加crossorigin属性并确保服务端CORS响应头正确;…

    2025年12月23日
    000
  • animate制作html5动画_时间轴与交互动画设计【指南】

    Animate HTML5 Canvas动画异常的解决方法包括:一、修正帧标签与关键帧;二、正确绑定按钮事件监听器;三、用CreateJS Tween替代传统补间;四、调试元素引用与作用域;五、禁用自动播放并手动控制。 如果您使用Adobe Animate制作HTML5 Canvas动画,但发现时间…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信