Hello 算法 1.1.0 JavaScript版2.1 算法效率评估 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2 迭代与递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 时间复杂度 . . . 综上所述,建议你在深入学习数据结构与算法之前,先对复杂度分析建立初步的了解,以便能够完成简单算 法的复杂度分析。 2.2 迭代与递归 在算法中,重复执行某个任务是很常见的,它与复杂度分析息息相关。因此,在介绍时间复杂度和空间复杂 度之前,我们先来了解如何在程序中实现重复执行任务,即两种基本的程序控制结构:迭代、递归。 2.2.1 迭代 迭代(iteration)是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段 系”“四次方 关系”,以此类推。 2.2.2 递归 递归(recursion)是一种算法策略,通过函数调用自身来解决问题。它主要包含两个阶段。 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。0 码力 | 379 页 | 18.46 MB | 1 年前3
Hello 算法 1.2.0 简体中文 JavaScript 版2.1 算法效率评估 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2 迭代与递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 时间复杂度 . . . 综上所述,建议你在深入学习数据结构与算法之前,先对复杂度分析建立初步的了解,以便能够完成简单算 法的复杂度分析。 2.2 迭代与递归 在算法中,重复执行某个任务是很常见的,它与复杂度分析息息相关。因此,在介绍时间复杂度和空间复杂 度之前,我们先来了解如何在程序中实现重复执行任务,即两种基本的程序控制结构:迭代、递归。 2.2.1 迭代 迭代(iteration)是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段 系”“四次方 关系”,以此类推。 2.2.2 递归 递归(recursion)是一种算法策略,通过函数调用自身来解决问题。它主要包含两个阶段。 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。0 码力 | 379 页 | 18.47 MB | 10 月前3
Hello 算法 1.0.0 JavaScript版2.1 算法效率评估 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2 迭代与递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 时间复杂度 . . . 综上所述,建议你在深入学习数据结构与算法之前,先对复杂度分析建立初步的了解,以便能够完成简单算 法的复杂度分析。 2.2 迭代与递归 在算法中,重复执行某个任务是很常见的,它与复杂度分析息息相关。因此,在介绍时间复杂度和空间复杂 度之前,我们先来了解如何在程序中实现重复执行任务,即两种基本的程序控制结构:迭代、递归。 2.2.1 迭代 「迭代 iteration」是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某 ”“四次方 关系”,以此类推。 2.2.2 递归 「递归 recursion」是一种算法策略,通过函数调用自身来解决问题。它主要包含两个阶段。 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。0 码力 | 376 页 | 17.57 MB | 1 年前3
Hello 算法 1.0.0b5 JavaScript版2.1 算法效率评估 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.2 迭代与递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3 时间复杂度 . . . 综上所述,建议你在深入学习数据结构与算法之前,先对复杂度分析建立初步的了解,以便能够完成简单算 法的复杂度分析。 2.2 迭代与递归 在数据结构与算法中,重复执行某个任务是很常见的,其与算法的复杂度密切相关。而要重复执行某个任务, 我们通常会选用两种基本的程序结构:迭代和递归。 2.2.1 迭代 「迭代 iteration」是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某 、“四次方 关系”、以此类推。 2.2.2 递归 「递归 recursion」是一种算法策略,通过函数调用自身来解决问题。它主要包含两个阶段。 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。0 码力 | 375 页 | 30.68 MB | 1 年前3
Hello 算法 1.0.0b1 JavaScript版线性对数阶 < 平方阶 < 指数阶 < 阶乘阶 Figure 2‑3. 时间复杂度的常见类型 2. 复杂度分析 hello‑algo.com 19 � 部分示例代码需要一些前置知识,包括数组、递归算法等。如果遇到看不懂的地方无需担心, 可以在学习完后面章节后再来复习,现阶段先聚焦在理解时间复杂度含义和推算方法上。 常数阶 ?(1) 常数阶的操作数量与输入数据大小 ? 无关,即不随着 ? 2^n - 1 return count; } Figure 2‑5. 指数阶的时间复杂度 在实际算法中,指数阶常出现于递归函数。例如以下代码,不断地一分为二,分裂 ? 次后停止。 // === File: time_complexity.js === /* 指数阶(递归实现) */ function expRecur(n) { if (n == 1) return 1; return count++; } return count; } Figure 2‑6. 对数阶的时间复杂度 与指数阶类似,对数阶也常出现于递归函数。以下代码形成了一个高度为 log2 ? 的递归树。 // === File: time_complexity.js === /* 对数阶(递归实现) */ function logRecur(n) { if (n <= 1) return 0; return0 码力 | 185 页 | 14.70 MB | 1 年前3
阮一峰 《ECMAScript 6入门》 第三版undefined] m1({z: 3}) // [0, 0] m2({z: 3}) // [undefined, undefined] 参数默认值的位置 通常情况下,定义了默认值的参数,应该是函数的尾参数。因为这样比较容易看出 来,到底省略了哪些参数。如果非尾部的参数设置默认值,实际上这个参数是没法 省略的。 函数的扩展 133 // 例一 function f(x = 1, y) { undefined] f(1) // [1, 5, undefined] f(1, ,2) // 报错 f(1, undefined, 2) // [1, 5, 2] 上面代码中,有默认值的参数都不是尾参数。这时,无法只省略该参数,而不省略 它后面的参数,除非显式输入 undefined 。 如果传入 undefined ,将触发该参数等于默认值, null 则没有这个效果。 function 值以后,预期传入的参数个数就不包括这个参数了。同理,后文的 rest 参数也不会 计入 length 属性。 (function(...args) {}).length // 0 如果设置了默认值的参数不是尾参数,那么 length 属性也不再计入后面的参数 了。 (function (a = 0, b, c) {}).length // 0 (function (a, b = 1, c) {})0 码力 | 679 页 | 2.66 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 JavaScript 版限的,過深的遞迴可能導致堆疊溢位錯誤。 2. 尾遞迴 有趣的是,如果函式在返回前的最後一步才進行遞迴呼叫,則該函式可以被編譯器或直譯器最佳化,使其在 空間效率上與迭代相當。這種情況被稱為尾遞迴(tail recursion)。 ‧ 普通遞迴:當函式返回到上一層級的函式後,需要繼續執行程式碼,因此系統需要儲存上一層呼叫的上 下文。 ‧ 尾遞迴:遞迴呼叫是函式返回前的最後一個操作,這意味著函式返回到上一層級後,無須繼續執行其他 設為函式參數,從而實現尾遞迴: // === File: recursion.js === /* 尾遞迴 */ function tailRecur(n, res) { // 終止條件 if (n === 0) return res; // 尾遞迴呼叫 return tailRecur(n - 1, res + n); } 尾遞迴的執行過程如圖 2‑5 所示。對比普通遞迴和尾遞迴,兩者的求和操作的執行點是不同的。 普通遞迴:求和操作是在“迴”的過程中執行的,每層返回後都要再執行一次求和操作。 ‧ 尾遞迴:求和操作是在“遞”的過程中執行的,“迴”的過程只需層層返回。 第 2 章 複雜度分析 www.hello‑algo.com 25 圖 2‑5 尾遞迴過程 Tip 請注意,許多編譯器或直譯器並不支持尾遞迴最佳化。例如,Python 預設不支持尾遞迴最佳化,因 此即使函式是尾遞迴形式,仍然可能會遇到堆疊溢位問題。 3. 遞迴樹0 码力 | 379 页 | 18.78 MB | 10 月前3
ECMAScript规范 第三版 中文版这说明一个参数列表可以表现为单个赋值表达式,或一个参 数列表后跟一个逗号,再跟一 个赋值表达式。参数列表的 定义是递归的(recursive),也就是说,它的定义中借用了它本身。 结果是参数列表可 以包含任意数量为正的参数,以逗号隔开,每个参数表达式都是一个赋值表 达式。像这样的非终结符的递归定义很常见。 出现在终结符或非终结符后面的下标后缀"opt",指出这是一个可选符号(optional symbol)。 RegExp (章节 15.10.4),或者以函数的方 式调用 RegExp 构造函数(章节 15.10.3)。 下面的产生式描述了正则表达式常量的语法,以及输入元素扫描器查找正则表达式常量结 尾的方法。给正则表达式构造函数传递包含正 则表达式体和正则表达式徽标的、不被解释的字 符串,将以更严厉的文法,根据它们自己解释它 们。实现可以扩展正则表达式构造函数的文法, 但不应扩展正 则表达式体和正 [[DefaultValue]]方法可以简单地抛出一个 TypeError 异常。) [[Prototype]]属性的值必 须是一个对象或 null,且每个[[Prototype]]链 长度必须有限(也就 是说,从一个对象开始,递归地访问[[Prototype]]属 性必须以一个 null 值结束。)本地对象是 否可以把宿主对象作为其[[Prototype]],这取决于具体实现。 对于所有种类的内置对象,本规范都定义了[[Class]]属0 码力 | 58 页 | 563.06 KB | 1 年前3
阮一峰 JavaScript 教程deprecated 参考链接 对象 - 108 - 本文档使用 书栈(BookStack.CN) 构建 函数 函数 概述 函数的声明 函数的重复声明 圆括号运算符,return 语句和递归 第一等公民 函数名的提升 函数的属性和方法 name 属性 length 属性 toString() 函数作用域 定义 函数内部的变量提升 函数本身的作用域 参数 概述 参数的省略 达式,就是函数的返回值。 return 语句不是必需的,如果没有的话, 该函数就不返回任何值,或者说返回 undefined 。 函数可以调用自身,这就是递归(recursion)。下面就是通过递 圆括号运算符,return 语句和递归 函数 - 113 - 本文档使用 书栈(BookStack.CN) 构建 归,计算斐波那契数列的代码。 1. function fib(num) { 12.9 ^ 0 // 12 异或运算符 二进制位运算符 - 187 - 本文档使用 书栈(BookStack.CN) 构建 左移运算符( << )表示将一个数的二进制值向左移动指定的位数,尾 部补 0 ,即乘以 2 的指定次方(最高位即符号位不参与移动)。 1. // 4 的二进制形式为100, 2. // 左移一位为1000(即十进制的8) 3. // 相当于乘以2的1次方0 码力 | 540 页 | 3.32 MB | 10 月前3
2019-2021 美团技术年货 前端篇功能的支持。为此,我们提供了对这些长尾功能的定制能力(这些功能默认不开启, 但业务可配置),将未被启用长尾的功能进行裁剪。 通过上述分析可得,我们的思路就是对 Dead Code 进行二次剔除,以及对这些长 尾功能做裁剪。基于这样的思路,我们深入 Dart-SDK、Framework 和 Flutter_ Web_SDK 各个击破,最终将 JS Bundle 产物体积由 1.2M 精简至 0.7M,为 随着 MV 模式的变动,DOM 也会随之发生变化。我们使用浏览器提供的 MutationObserver API 对 DOM 变化进行收集,并筛选有效节点进行深度优 先遍历,计算每个 DOM 的递归权重值,低于阈值我们就认为首屏已加载完成。 ● 第二部分是监听资源的变化。我们利用浏览提供的 PerformanceObserver API,筛选出 img/script 类型的资源,在 3 将扁平的数据源转化为树状结构的 DSL,这个过程如果是人脑来做会怎么思考呢? 先确定布局的整体结构是行布局或者列布局,然后再确定局部区域应该是什么布局结 构,最后组装起来形成视图树。这个过程与递归算法类似,因此我们采用了递归算法 前端 < 63 作为算法的主框架,同时引入了“横竖切割 + 布局结构 + 模型评估”三大利器。 利器一:横竖切割 生成 DSL 时采用了整分的思路,即将大布局不断的切分成小布局,下面以动画的形0 码力 | 738 页 | 50.29 MB | 1 年前3
共 11 条
- 1
- 2













