Hello 算法 1.2.0 繁体中文 Dart 版
提供的排版建議,以及他開發的開源文件主題 Material‑for‑MkDocs 。 在寫作過程中,我閱讀了許多關於資料結構與演算法的教材和文章。這些作品為本書提供了優秀的範本,確 保了本書內容的準確性與品質。在此感謝所有老師和前輩的傑出貢獻! 本書倡導手腦並用的學習方式,在這一點上我深受《動手學深度學習》的啟發。在此向各位讀者強烈推薦這 本優秀的著作。 衷心感謝我的父母,正是你們一直以來的支持與鼓勵,讓我有機會做這件富有趣味的事。 5. 完成找零,方案為 20 + 10 + 1 = 31 元。 第 1 章 初識演算法 www.hello‑algo.com 13 圖 1‑3 貨幣找零過程 在以上步驟中,我們每一步都採取當前看來最好的選擇(儘可能用大面額的貨幣),最終得到了可行的找零方 案。從資料結構與演算法的角度看,這種方法本質上是“貪婪”演算法。 小到烹飪一道菜,大到星際航行,幾乎所有問題的解決都離不開演算法。計算機的出現使得我們能夠透過程 1 章 初識演算法 www.hello‑algo.com 16 ‧ 整理撲克的過程與插入排序演算法非常類似。插入排序演算法適合排序小型資料集。 ‧ 貨幣找零的步驟本質上是貪婪演算法,每一步都採取當前看來最好的選擇。 ‧ 演算法是在有限時間內解決特定問題的一組指令或操作步驟,而資料結構是計算機中組織和儲存資料 的方式。 ‧ 資料結構與演算法緊密相連。資料結構是演算法的基石,而演算法為資料結構注入生命力。0 码力 | 378 页 | 18.77 MB | 9 月前3Hello 算法 1.0.0b5 Dart版
递归调用函数会产生额外的开销。因此递归通常比循环的时间效率更低。 如图 2‑4 所示,在触发终止条件前,同时存在 ? 个未返回的递归函数,递归深度为 ? 。 第 2 章 复杂度分析 hello‑algo.com 23 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出报错。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无需继续执行其他 操作,因此系统无需保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归。 ,求该数列的第 ? 个数字。 设斐波那契数列的第 ? 个数字为 ?(?) ,易得两个结论。 ‧ 数列的前两个数字为 ?(1) = 0 和 ?(2) = 1 。 ‧ 数列中的每个数字是前两个数字的和,即 ?(?) = ?(? − 1) + ?(? − 2) 。 按照递推关系进行递归调用,将前两个数字作为终止条件,便可写出递归代码。调用 fib(n) 即可得到斐波那 契数列的第 ? 个数字。0 码力 | 376 页 | 30.67 MB | 1 年前3Hello 算法 1.1.0 Dart版
递归调用函数会产生额外的开销。因此递归通常比循环的时间效率更低。 如图 2‑4 所示,在触发终止条件前,同时存在 ? 个未返回的递归函数,递归深度为 ? 。 第 2 章 复杂度分析 hello‑algo.com 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: ,求该数列的第 ? 个数字。 设斐波那契数列的第 ? 个数字为 ?(?) ,易得两个结论。 ‧ 数列的前两个数字为 ?(1) = 0 和 ?(2) = 1 。 ‧ 数列中的每个数字是前两个数字的和,即 ?(?) = ?(? − 1) + ?(? − 2) 。 按照递推关系进行递归调用,将前两个数字作为终止条件,便可写出递归代码。调用 fib(n) 即可得到斐波那 契数列的第 ? 个数字:0 码力 | 378 页 | 18.45 MB | 1 年前3Hello 算法 1.2.0 简体中文 Dart 版
比循环的时间效率更低。 如图 2‑4 所示,在触发终止条件前,同时存在 ? 个未返回的递归函数,递归深度为 ? 。 第 2 章 复杂度分析 www.hello‑algo.com 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: ,求该数列的第 ? 个数字。 设斐波那契数列的第 ? 个数字为 ?(?) ,易得两个结论。 ‧ 数列的前两个数字为 ?(1) = 0 和 ?(2) = 1 。 ‧ 数列中的每个数字是前两个数字的和,即 ?(?) = ?(? − 1) + ?(? − 2) 。 按照递推关系进行递归调用,将前两个数字作为终止条件,便可写出递归代码。调用 fib(n) 即可得到斐波那 契数列的第 ? 个数字:0 码力 | 378 页 | 18.46 MB | 9 月前3Hello 算法 1.0.0 Dart版
递归调用函数会产生额外的开销。因此递归通常比循环的时间效率更低。 如图 2‑4 所示,在触发终止条件前,同时存在 ? 个未返回的递归函数,递归深度为 ? 。 第 2 章 复杂度分析 hello‑algo.com 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归: ,求该数列的第 ? 个数字。 设斐波那契数列的第 ? 个数字为 ?(?) ,易得两个结论。 ‧ 数列的前两个数字为 ?(1) = 0 和 ?(2) = 1 。 ‧ 数列中的每个数字是前两个数字的和,即 ?(?) = ?(? − 1) + ?(? − 2) 。 按照递推关系进行递归调用,将前两个数字作为终止条件,便可写出递归代码。调用 fib(n) 即可得到斐波那 契数列的第 ? 个数字:0 码力 | 377 页 | 17.56 MB | 1 年前3
共 5 条
- 1