ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

freeCodeCamp 算法课程源码解析:用 Python 实现二分查找,读懂 `while first <= last` 循环条件

freeCodeCamp 算法课程源码解析:用 Python 实现二分查找,读懂 `while first <= last` 循环条件 freeCodeCamp 算法课程源码解析用 Python 实现二分查找读懂while first last循环条件【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇技术文章围绕 freeCodeCamp 课程仓库中的视频课Binary Search in Code展开你将了解这节课如何用 Python 编写二分查找Binary Search的迭代实现、课后测验聚焦的while first last:循环终止条件为何正确以及这个视频挑战Video Challenge在 freeCodeCamp 课程体系与仓库源码中的定位与校验机制。读完后你既能掌握二分查找的完整编码方案与边界条件推理也能理解 freeCodeCamp 是如何用结构化 Markdown JSON 目录 Joi 模式来组织和校验课程内容的。这节课在课程结构中的位置algorithms-in-code 讲座块Binary Search in Code并不是孤立的挑战文件它属于课程结构文件 algorithms-in-code.json 中定义的讲座块lecture block{ blockLabel: lecture, blockLayout: challenge-list, isUpcomingChange: false, dashedName: algorithms-in-code, helpCategory: Backend Development, challengeOrder: [ { id: 698dca057932b3cc4b19c926, title: Linear Search in Code }, { id: 698dcc2c7932b3cc4b19c927, title: Binary Search in Code }, { id: 698dce727932b3cc4b19c928, title: Recursive Binary Search } ] }从该结构文件可以看到三点事实blockLabel为lecture、blockLayout为challenge-list即这是一个按列表排布、以讲授为主的讲座型代码块helpCategory为Backend Development说明它在帮助分类中归属于后端开发方向challengeOrder按id精确编排了三个视频挑战的学习顺序先线性查找、再二分查找、最后是递归版二分查找。Binary Search in Code的id698dcc2c7932b3cc4b19c927与源文档 frontmatter 中的id完全一致这正是课程解析器把 Markdown 挑战文件与结构文件关联起来的键。与本篇配套的前后两节分别是linear-search-in-code-video.md用 Python 实现线性查找测验考察如何正确写出linear_search函数正确写法是对range(len(list))遍历命中list[i] target时返回下标i循环结束仍未命中则返回-1recursive-binary-search-video.md学习把二分查找改写为递归解法测验考察什么是递归函数答案一个调用自身的函数。这三节课构成了一条清晰的知识递进线O(n) 的线性查找 → O(log n) 的迭代二分查找 → 二分查找的递归表达。本篇文档正是中间、也是最核心的一环。课程核心内容用 Python 编码二分查找源文档 binary-search-in-code-video.md 的 frontmatter 与正文如下--- id: 698dcc2c7932b3cc4b19c927 title: Binary Search in Code challengeType: 11 videoId: mg7F5D8Wk5o dashedName: binary-search-in-code ---# --description-- In this video, you will code out the binary search algorithm using Python.课程目标是在视频中用 Python 把二分查找算法完整编码出来。frontmatter 中challengeType: 11表明它是一条视频挑战videoId: mg7F5D8Wk5o是平台加载的视频标识该字段为视频类挑战的必填项见下文模式校验小节。视频中展示的是一份迭代式循环式二分查找实现。视频代码本身并不存储在仓库中仓库只保存挑战的结构化元数据与题目但从测验题干——Why was thewhile first last:condition used in the solution?——可以推断课程方案使用first、last两个边界指针配合while first last:循环来逐步收缩搜索区间。与其题干描述严格对应的典型迭代实现结构如下以该条件为核心供读者对照视频复现def binary_search(arr, target): first 0 last len(arr) - 1 while first last: # 区间非空时继续搜索 mid (first last) // 2 if arr[mid] target: # 命中返回下标 return mid elif arr[mid] target: # 目标在右半区 first mid 1 else: # 目标在左半区 last mid - 1 return -1 # 区间收缩为空未找到这份实现的关键要素正是测验要考察的内容first/last两个指针始终框定当前仍可能包含目标元素的区间[first, last]mid (first last) // 2取区间中点每次比较后区间规模约减半这是二分查找 O(log n) 复杂度的来源while first last:是循环存活条件只要first last就代表区间内还有元素可以继续检查一旦某次收缩使first last说明区间已经为空搜索必须终止return -1作为未找到的哨兵返回值与前面线性查找课中return -1的约定保持一致。测验解析为什么循环条件必须是while first last:源文档附带一道单选题# --questions--区块完整题目与四个选项如下Why was thewhile first last:condition used in the solution?To ensure only the first half of the array is ever checked.To make the loop run forever until manually stopped.To skip checking the last element in the search range.To keep searching while there are still elements in the range and stop when the range is empty.文档中的## --video-solution--标注答案为4即在区间内还有元素时继续搜索当区间为空时停止。逐条辨析其余干扰项为何错误选项 1只检查数组的前半部分错误二分查找在命中前会不断在左、右半区之间切换first mid 1或last mid - 1并非只检查前一半选项 2让循环一直运行直到手动停止错误该条件恰恰相反它是明确的终止条件保证循环必然在有限步内结束选项 3跳过检查最后一个元素错误这正是与的本质区别。若写成while first last:当区间缩小到只剩一个元素first last时循环会提前退出那个最后的候选元素就永远不会被比较导致查找失败选项 4 正确first last精确等价于闭区间[first, last]至少包含一个元素。区间非空则继续二分区间收缩为空first last则搜索空间耗尽、返回-1。这个条件看似只是的一字之差却是二分查找正确性的核心边界处理它保证区间长度为 1 时仍会执行最后一次中点检查从而不遗漏任何候选位置。视频挑战在 freeCodeCamp 仓库中的实现机制从源码结构看这个 Markdown 文件并不是一段自由文本而是被 freeCodeCamp 的课程管线当作结构化数据来处理的挑战定义文件。其关键字段在以下源码中有明确定义1. 挑战类型常量challengeType: 11即video在 challenge-types.ts 中定义了const video 11;并导出为challengeTypes.video。同一个文件还决定了该类型在前端与提交层的行为viewTypes中[video]: genericchallenge-types.ts即视频挑战在前端以通用视图渲染submitTypes中[video]: testschallenge-types.ts即完成视频课答对测验走统一的测试提交流程hasNoSolution的noSolutions列表包含videochallenge-types.ts说明视频挑战不提供可对比的代码参考答案——这与它以视频讲解 测验考核的形态一致。2. Joi 模式对字段的强制校验课程模式文件 challenge-schema.js 定义了挑战文件必须满足的字段约束与本文档 frontmatter 一一对应challengeType: Joi.number().min(0).max(33).required()challenge-schema.js11落在合法范围内videoId被声明为仅当challengeType为challengeTypes.video时的必填项challenge-schema.js这解释了为什么本文档必须携带videoId: mg7F5D8Wk5oquestions同样被约束为在video、multipleChoice、theOdinProject等类型下必须存在challenge-schema.js对应本文档# --questions--区块中不可缺失的测验题description在step、video、multipleChoice、fillInTheBlank、review等类型下为必填challenge-schema.js对应文档中的# --description--区块。3. 正文标记区块到数据模型的映射文档正文中的# --description--、# --questions--、## --text--、## --answers--各选项以---分隔、## --video-solution--是 freeCodeCamp 课程解析器约定的标记语法描述、题干、选项数组与正确选项序号会被解析后进入课程数据模型供前端渲染与测验判分使用。--video-solution--中的数字4即第 4 个选项为正确答案与上文测验解析的结论一致。小结Binary Search in Code是 freeCodeCampalgorithms-in-code讲座块中的第二课与线性查找课、递归二分查找课共同构成搜索算法的递进学习路径其课程核心是用 Python 实现迭代版二分查找测验聚焦while first last:这一终止条件——它保证区间非空就继续、区间为空才停且是覆盖单元素区间的必要写法在仓库层面该文件通过challengeType: 11video接入共享包中的类型常量体系并通过 challenge-schema.js 的 Joi 规则完成videoId、description、questions等字段的强制校验体现了Markdown 即课程数据的工程化设计。想继续深入的话可以沿着 algorithms-in-code.json 中的challengeOrder依次阅读三课源文件或从 challenge-types.ts 入手通读 freeCodeCamp 全部 34 种挑战类型的定义。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进