伯克利 CS61A 课堂笔记 10 —— Trees
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。
目录
01 Trees 树
Ⅰ Tree Abstraction
Ⅱ Implementing the Tree Abstraction
02 Tree Processing 建树过程
Ⅰ Fibonacci tree
Ⅱ Tree Processing uses recursion
Ⅲ Creating Trees
03 Example: Printing Trees
04 Example: Summing Paths
05 Example: Counting Paths
附:词汇解释
01 Trees 树
Ⅰ Tree Abstraction

Recursive description (wooden trees):
A tree has a root label and a list of branches.
Each branch is a tree.
A tree with zero branches is called a leaf.
Relative description (family trees):
Each location in a tree is called a node.
Each node has a label that can be any value.
One node can be the parent/child of another.
![]()
Ⅱ Implementing the Tree Abstraction

>>> tree(3, [tree(1), tree(2, [tree(1), tree(1)])])
[3, [1], [2, [1], [1]]]
#Treesdef tree(label, branches=[]):#Verifies the tree definitionfor branch in branches:assert is_tree(branch)return [label] + list(branches)def label(tree):return tree[0]def branches(tree):return tree[1:]def is_leaf(tree):return not branches(tree)def is_tree(tree):#Verifies the tree definitionif type(tree) != list or len(tree) < 1:return falsefor branch in branches(tree):if not is_tree(branch):return falsereturn true
>>> tree(1)
[1]
>>> is_leaf(tree(1))
true>>> t = tree(1, [tree(5, [tree(7)]), tree(6)])
>>> t
[1, [5, [7]], [6]]
>>> label(t)
1
>>> branches(t)
[[5, [7]], [6]]
>>> branches(t)[0]
[5, [7]]
>>> is_tree(branches(t)[0])
true
>>> label(branches(t)[0])
5
02 Tree Processing 建树过程
Ⅰ Fibonacci tree
def fib_tree(n):if n <= 1:return tree(n)else:left, right = fib_tree(n-2), fib_tree(n-1)return tree(label(left)+label(right), [left, right])
>>> fib_tree(0)
[0]
>>> fib_tree(1)
[1]
>>> fib_tree(2)
[1, [0], [1]]
>>> fib_tree(4)
[3, [1, [0], [1]], [2, [1], [1, [0], [1]]]]
>>> label(fib_tree(4))
3
Ⅱ Tree Processing uses recursion
Processing a leaf is often the base of a tree processing function.
The recursive case typically makes a recursive call on each branch, then aggregates the results.
def count_leaves(t):"""Count the leaves of a tree."""if is_leaf(t):return 1else:#寻找分支的叶子return sum([count_leaves(b) for b in branches(t)])
>>> count_leaves(fib_tree(4))
5

>>> count_leaves(fib_tree(10))
89
Implement leaves, which returns a list of the leaf of a tree.
Hint: If you sum a list of lists, you get a list containing the elements of those lists.
>>> sum([[1], [2, 3], [4]], [])
[1, 2, 3, 4]
>>> sum([[1]], [])
[1]
>>> sum([[[1]], [2]], [])
[[1], 2]
def leaves(tree):"""Return a list containing the leaf labels of tree.>>> leaves(fib_tree(4))[0, 1, 1, 0, 1]"""if is_leaf(tree):return [label(tree)]else:#寻找分支的叶子return sum([leaves(b) for b in branches(tree)], [])
Ⅲ Creating Trees
A function that creates a tree from another tree is typically also recursive.
def increment_leaves(t):"""Return a tree like t but with leaf labels incremented."""if is_leaf(t):return tree(label(t) + 1)else:return tree(label(t), [increment_leaves(b) for b in branches(t)])def increment(t):"""Return a tree like t but with all labels incremented."""return tree(label(t) + 1, [increment_leaves(b) for b in branches(t)])
03 Example: Printing Trees
#原始版
def print_tree(t):print(label(t))for b in branches(t):print_tree(b)
>>> print_tree(fib_tree(4))
3
1
0
1
2
1
1
0
1
#升级版
def print_tree(t, indent=0){print(' ' * indent + str(label(t)))for b in branches(t):print_tree(b, indent + 1)
}
>>> print_tree(fib_tree(4))
310121101
04 Example: Summing Paths
def fact(n):"Return n * (n-1) * ... * 1"if n == 0:return 1else:return n * fact(n - 1)def fact_times(n, k):"Return k * n * (n-1) * ... * 1"if n == 0:return kelse:return fact_times(n - 1, k * n)def fact_plus(n):return fact_times(n, 1)
>>> fact_plus(4)
24
from tree import *numbers = tree(3, [tree(4), tree(5, [tree(6)])])haste = tree('h', [tree('a', [tree('s'),tree('t')]),tree('e')])def print_sums(t, so_far):so_far = so_far + label(t)if is_leaf(t):print(so_far)else:for b in branches(t):print_sums(b, so_far)
>>> print_sums(numbers, 0)
7
14
>>> print_sums(haste, '')
has
hat
he
05 Example: Counting Paths
Count paths that have a total label sum.
def count_paths(t, total):"""Return the number of paths from the root to any node in tree tfor which the labels along the path sum to total.>>> t = tree(3, [tree(-1), tree(1, [tree(2, [tree(1)]), tree(3)]), tree(1, [tree(-1)])])>>> count_paths(t, 3)2>>> count_paths(t, 4)2>>> count_paths(t, 5)0>>> count_paths(t, 6)1>>> count_paths(t, 7)2"""if label(t) == total:found = 1else:found = 0return found + sum(count_paths(b, total - label(t)) for b in branches(t))
附:词汇解释
verify 证明、definition 定义、aggregate / ˈæɡrɪɡət / 合计、hint / hɪnt / 提示、increment / ˈɪŋkrəmənt / 增长、indent / ɪnˈdent / 缩进、factorial / fækˈtɔːriəl / 阶乘
相关文章:
伯克利 CS61A 课堂笔记 10 —— Trees
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…...
全局动态组件uniapp(vue)
全局动态组件uniapp(vue) 在我们很多项目中,我们需要创建一个组件,使其他在所有的路由页都存在,比如手机上的悬浮在屏幕上的圆形快捷按钮,那么我们就需要创建一个全局组件。 创建组件时我们所考虑的主要是两个点,一个…...
spring分层解耦(springboot)
三层架构 三层架构在项目文件中的分布 软件设计的原则,高内聚低耦合 高内聚:软件中各个功能模块内部的功能联系紧密,每个模块的功能实现具体 低耦合:软件中各个层/模块之间的依赖,关联的程度低 分层解耦的思想 IOC&…...
最新智能优化算法:牛优化( Ox Optimizer,OX)算法求解经典23个函数测试集,MATLAB代码
一、牛优化算法 牛优化( OX Optimizer,OX)算法由 AhmadK.AlHwaitat 与 andHussamN.Fakhouri于2024年提出,该算法的设计灵感来源于公牛的行为特性。公牛以其巨大的力量而闻名,能够承载沉重的负担并进行远距离运输。这种…...
尚硅谷 java 学习Day19 抽象类与抽象方法、接口、内部类
6-5 抽象类(abstract)与抽象方法(important) 一、什么叫抽象类: 有时候将一个父类设计的非常抽象,以至于它没有具体的实例,这样的类称为抽象类 abstract关键字的使用: 1、abstract:抽象的 2、abs…...
机器学习数理基础:从概率到梯度下降的全面解析
一、引言:为什么需要数理基础? 机器学习是数据与算法的艺术,而数学是其背后的语言。无论是理解模型原理、优化算法,还是解决实际问题,扎实的数理基础都是必不可少的。本文将从概率论、线性代数、微积分三大核心领域出发…...
数据结构:哈希
哈希函数的概念:哈希函数是哈希表(散列表)的核心组件,其作用是将任意长度的键(Key)映射为固定长度的存储地址,以实现高效的数据存储与检索。以下是哈希函数在数据结构中的关键知识点总结&#x…...
Openssl交叉编译
在 OpenSSL 交叉编译中,linux-aarch64是一个用于指定目标平台的配置选项,表示目标是 X86 架构的 64位系统。这个选项可以从 OpenSSL 的 ./Configure 命令支持的平台列表中获取。 你可以通过运行以下命令查看 OpenSSL 支持的所有平台配置选项:…...
【linux】更换ollama的deepseek模型默认安装路径
【linux】更换ollama的deepseek模型默认安装路径 文章目录 【linux】更换ollama的deepseek模型默认安装路径Ollama 默认安装路径及模型存储路径迁移ollama模型到新的路径1.创建新的模型存储目录2.停止ollama3.迁移现有模型4.修改 Ollama 服务配置5.重启ollama6.验证迁移是否成功…...
组合模式详解(Java)
一、组合模式基本概念 1.1 定义与类型 组合模式是一种结构型设计模式,它通过将对象组织成树形结构,来表示“部分-整体”的层次关系。这种模式使得客户端可以一致地对待单个对象和组合对象,从而简化了客户端代码的复杂性。组合模式的核心在于定义了一个抽象组件角色,这个角…...
蓝桥杯单片机基础部分——单片机介绍部分
前言 这个部分是额外的,我看我有的学弟学妹基础比较差,对板子上面的模块不太熟悉,这里简单的介绍一下 蓝桥杯单片机 这个就是蓝桥杯单片机的板子,它的主控芯片是(IAP15F2K61S2),这里就对他常用…...
如何简单的去使用jconsloe 查看线程 (多线程编程篇1)
目录 前言 1.进程和线程 进程 PCB 的作用 并发编程和并行编程 线程 为什么选择多线程编程 2.在IDEA中如何简单创建一个线程 1. 通过继承Thread类 2. 通过实现 Runnable 接口 3. 使用 Lambda 表达式 3.如何简单使用jconsloe去查看创建好的线程 前言 2025来了,这是第…...
python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python 二、处理 Excel 文件(openpyxl库)三、 处理 Word 文件(python-docx库)四、 处理 PPT 文件(python-pptx库)五、 自动发送邮件(smtplib和…...
DeepSeek教unity------Dotween
1、命名法 Tweener(补间器):一种控制某个值并对其进行动画处理的补间。 Sequence(序列):一种特殊的补间,它不直接控制某个值,而是控制其他补间并将它们作为一个组进行动画处理。 Tw…...
前端开发中关于虚拟列表的实现与应用优化
前端开发中关于虚拟列表的实现与应用优化 一、引言 在前端开发的日常工作中,我们常常会遇到需要展示大量数据列表的场景。比如电商平台的商品列表、社交平台的动态信息流等。当数据量庞大时,直接渲染所有数据会导致页面性能急剧下降,出现卡…...
图解JVM-1. JVM与Java体系结构
一、前言 在 Java 开发的广袤天地里,不少开发者都遭遇过令人头疼的状况。线上系统毫无征兆地卡死,陷入无法访问的僵局,甚至直接触发 OOM(OutOfMemoryError,内存溢出错误);面对 JVM 的 GC&#…...
Word中的文档信息域
Word中的文档信息域 DocProperty包含文档信息的多个属性, 也可以自定义属性. 查看文档预定义的自定义属性 【文件】→【信息】→【属性】→【高级属性】 参考链接 WORD中文档属性域DocProperty的应用-CSDN博客 第06套 Word_哔哩哔哩_bilibili...
Linux中的权限问题(二)
一、不受权限约束的root 按照文件的使用者进行匹配后,即使权限是“---” root依旧可以正常进行读,写,运行 二、文件拥有者和所属组的更改方法以及限制 2.1chown:更改文件拥有者以及所属组 ①可以单独修改文件拥有者 chown[更…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十八节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(ResponseOnEvent_0x86服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x86服务、事件响应、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x86…...
Spring Boot自动装配:约定大于配置的魔法解密
#### 一、自动装配的哲学思考 在传统Spring应用中,开发者需要手动配置大量的XML或JavaConfig。Spring Boot通过自动装配机制实现了**约定大于配置**的设计理念,其核心思想可以概括为: 1. **智能预设**:基于类路径检测自动配置 2…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...
