【头歌educoder】离散数学实训参考-第一章-集合

这篇具有很好参考价值的文章主要介绍了【头歌educoder】离散数学实训参考-第一章-集合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 集合及其基本运算的实现

第一关:set简单应用

第二关:《仲夏夜之梦》中的回文单词对

第三关:求幂集 

第四关:计算n个集合的笛卡尔乘积

2. 自然数系统

第一关:NaturalNumber的输出 

第二关:NaturalNumber的加法

第三关:NaturalNumber的乘法

第四关:将NaturalNumber转换为阿拉伯数字

第五关:后继函数

第六关:foldn构建自然数

第七关:另一种foldn表示自然数

自然数系统代码总和


        本人没有系统学过离散数学,完成这些实训仅仅是在熟悉python。


  

1. 集合及其基本运算的实现

第一关:set简单应用

  • 任务简述:读取文本并输出第一次出现的单词

  • 总体思路:读取一个单词后,判断是否已经出现过

  • 相关知识:集合及其方法的使用、文件读取

  • 关卡难度:0.5

def readAndPrintUniqueWords(filename):
    infile = open(filename, 'r')
    #**********  Begin  **********#
    #请在此区间内编程完成函数代码

    s = set()  # 空集合
    for line in infile.readlines():
        if line.strip() not in s:  # 如果此行单词未出现过
            s.add(line.strip())
            print(line.strip())

    #请在此区间内编程完成函数代码
    #**********  End  **********#
    infile.close()

第二关:《仲夏夜之梦》中的回文单词对

  • 任务简述:将所有长度大于等于5,且该单词的字母反序单词也出现在了全部找出
  • 总体思路:单词读出于一列表;集合化;从集合中去除不满足的单词
  • 相关知识:字符串分割与切片、集合及其remove方法、文件读取
  • 关卡难度:1
def shakeSpeare(filename):
    #**********  Begin  **********#
    #请在此区间内编程实现函数功能

	words = None
    with open(filename, 'r') as f:
		text = f.read()
		words = text.split(' ')  # 数组
	# 集合化
	reverse = set(words)
    # 要对words迭代,而不是reverse
	for word in words:
        # 先判断单词是否在集合里,不然set::remove()可能报错
		if word in reverse:
            # 字符串切片来表回文
			if word[::-1] not in reverse or len(word) < 5:
				reverse.remove(word)

    #请在此区间内编程实现函数功能
    #**********  End  **********#
    return reverse

第三关:求幂集 

  • 任务简述:返回一个集合的幂集,是一个以frozen集合为元素的集合
  • 总体思路:幂集中的元素分为两类:包含e的、不包含e的(e为原集合中任意元素)
  • 相关知识:frozenset的使用,递归(函数内调用函数自身)
  • 关卡难度:1.5
def powSet(S):
    #**********  Begin  **********#
    #请在此区域内编程																						
	# 空集的幂集														
    if not S:
        return {frozenset({})}
    else:
		# 先求出不含元素elem的幂集
        elem = S.pop()
        WithoutElem = powSet(S)
		# 再求出包含elem的幂集元素
        WithElem = set()
        for ei in WithoutElem:
			# ei 是frozenset(),可使用union,不能add
            WithElem.add(ei.union({elem}))
		# 包含elem的幂集和不包含elem的幂集之并
        return WithoutElem.union(WithElem)
	
    #请在此区域内编程
    #**********  End  **********#

第四关:计算n个集合的笛卡尔乘积

  • 任务简述:求n维笛卡尔乘积,返回n元序偶(元组tuple)为元素的集合
  • 总体思路:求出n-1维,对其修正
  • 相关知识:不定长参数的函数、递归或迭代、元组的使用
  • 关卡难度:1.8
def DescartesProduct(*args):
    #**********  Begin  **********#
    #请在此区域编程实现函数功能

    n = len(args)  # args是一个元组
	# 0D
    if n == 0:
        return {}
	# 判断第一个参数的类型,如果是长度为1且其为元组,则修正
    if n == 1 and isinstance(args[0], tuple):
        args = args[0]
        n = len(args)
    # 1D,递归终止条件
    if n == 1:
        return {(arg,) for arg in args[0]}
    # nD
    a = args[0]
    x = DescartesProduct(args[1:])  # (n-1)D
    # 如果选出的维度里无元素
    if not a:
        return x
    # 以下从n-1维得到n维
    y = set()
    for ai in a:
        for xi in x:
            y.add((ai, ) + xi)
    return y
    
    #请在此区域编程实现函数功能
    #**********  End  **********#


2. 自然数系统

第一关:NaturalNumber的输出 

  • 任务简述:重载类NaturalNumber的方法__str__(self),使打印自己想要的结果
  • 总体思路:自然数n表示为None的(n+1)次后继,只需简单迭代
  • 相关知识:类(属性与方法)、类方法重载、迭代
  • 难度:0.3    代码于末尾

第二关:NaturalNumber的加法

  • 任务简述:重载类NaturalNumber的方法__add__(self),实现加法
  • 总体思路:n+0 = n、n+m`=(n+m)`、`表示后继
  • 相关知识:类(属性与方法)、类方法重载、迭代
  • 难度:0.7    代码于末尾

第三关:NaturalNumber的乘法

  • 任务简述:重载类NaturalNumber的方法__mul__(self),实现乘法
  • 总体思路:n*0 = 0、n*m` = n*m + n
  • 相关知识:类(属性与方法)、类方法重载、迭代
  • 难度:1    代码于末尾

第四关:将NaturalNumber转换为阿拉伯数字

  • 任务简述:添加方法toNumber(self),将NaturalNumber对象转换成阿拉伯数字
  • 总体思路: 0 = 0、toNumber(n) = toNumber(n-1) + 1
  • 相关知识:类(属性与方法)、迭代
  • 难度:0.5    代码于末尾

第五关:后继函数

  • 任务简述:添加函数succ(n),该函数返回以n为前继的NaturalNumber对象
  • 总体思路:简单加1(NaturalNumber中的实例1)、succ(n) = n + 1
  • 相关知识:函数
  • 难度:0.3    代码于末尾

第六关:foldn构建自然数

  • 任务简述:添加函数foldn(init, h, n),实现自然数m的表示,m = h(foldn(init, h, n-1)) or 0
  • 总体思路:foldn(z, h, 0) = z、foldn(z, h, n) = h(fold(z, h, n-1))
  • 相关知识:函数名作为参数的函数、迭代
  • 难度:1.8     代码于末尾

第七关:另一种foldn表示自然数

  • 任务简述:添加函数foldn2(init, h),实现加、乘、幂运算
  • 总体思路:内部还是一个加法式的迭代
  • 相关知识:返回函数名的函数(简单认为)、迭代
  • 难度:2    代码于末尾

自然数系统代码总和

class NaturalNumber(object):
    def __init__(self, pre):
        self.pre = pre
	
    def __str__(self):
        if self.pre is None:  # 0是None的后继
            return 'Zero'
        if self.pre.pre is None:  # 1是None的后继的后继
            return 'Succ Zero'
        # 迭代时注意圆括号
        return f'Succ({self.pre.__str__()})'

    def __add__(self, other):
        # 该方法重载 + 运算
        # a + zero = a
        # a + succ(b) = succ(a + b)
        if other.pre is None:
            return self
        else:
            return NaturalNumber(self + other.pre)

    def __mul__(self, other):
        # 该方法重载 * 运算
        # a * zero = zero
        # a * succ(b) = a * b + a
        if self.pre is None or other.pre is None:
            return NaturalNumber(None)
        else:
            return self.pre * other + other

    def toNumber(self):
        # 实现转换为阿拉伯数字
		# 0 = 0、toNumber(n) = toNumber(n-1) + 1
        if self.pre is None:
            return 0
        else:
            return 1 + self.pre.toNumber()


def succ(n: NaturalNumber):
    # 返回一个以对象n为前继的NaturalNumber对象
    # succ(n) = n + 1
    return n + NaturalNumber(NaturalNumber(None))


def foldn(init: NatualNumber, h, n: int):
    # n=0,无需迭代
    if n == 0:
        return init
    # n>0,迭代n-1次
    return h(foldn(init, h, n - 1))


def foldn2(init: NaturalNumber, h):
    # 下面函数实现foldn函数
    def f(n: NaturalNumber):
        if n.pre is None:
            return init
        else:
            return h(foldn2(init, h)(n.pre))
    return f

 初笔于2023年4月1日。文章来源地址https://www.toymoban.com/news/detail-697011.html

到了这里,关于【头歌educoder】离散数学实训参考-第一章-集合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 头歌实训-离散数学-图论!

    5阶无向完全图的边数为:10 设图 G 有 n 个结点, m 条边,且 G 中每个结点的度数不是 k ,就是 k+1 ,则 G 中度数为 k 的节点数是: n(k+1)-2m 若一个图有5个顶点,8条边,则该图所有顶点的度数和为多少?16 他让输出关联矩阵和邻接矩阵这不简单么? 我是直接摆烂了 输出个球呀

    2024年02月04日
    浏览(75)
  • ​​​​​​​头歌(EduCoder)Java实训作业答案

    搜集整理了一份最新最全的头歌(EduCoder)Java实训作业答案,分享给大家~ (EduCoder)是信息技术类实践教学平台。(EduCoder)涵盖了计算机、大数据、云计算、人工智能、软件工程、物联网等专业课程。超60000个实训案例,建立学、练、评、测一体化实验环境。   第一关 第二关 C

    2024年02月08日
    浏览(44)
  • CSS--头歌(educoder)实训作业题目及答案

    目录 CSS——基础知识 第1关: 初识CSS:丰富多彩的网页样式 第2关: CSS样式引入方式 CSS——基础选择器 第1关: CSS 元素选择器 第2关: CSS 类选择器 第3关: CSS id选择器 CSS——文本与字体样式 第1关: 字体颜色、类型与大小 第2关: 字体粗细与风格 第3关: 文本装饰与文本布局 CSS——

    2024年04月15日
    浏览(137)
  • JavaScript上部分--头歌(educoder)实训作业题目及答案

      目录 JS简介 第1关: JavaScript基础入门 第2关: JavaScript 与 HTML 第3关: JavaScript 变量 JS 数据类型 第1关: JavaScript 数据类型介绍 第2关: JavaScript 数据类型转换 JS运算符 第1关: 算术运算符 第2关: 比较和逻辑运算符 第3关: 条件和赋值运算符 第4关: 运算符的优先级和结合性 JS对象 第

    2024年02月08日
    浏览(34)
  • JavaScript下部分--头歌(educoder)实训作业题目及答案

    目录  JSON 第1关: JSON对象 第2关: JSON数组 第3关: JSON字符串 Math、日期和异常处理 第1关: Math类 第2关: Date类 第3关: JavaScript错误 HTML DOM——文档元素的操作(一) 第1关: 通过id获取文档元素 第2关: 通过类名获取文档元素 第3关: 通过标签名获取文档元素 第4关: html5中获取元素的

    2023年04月26日
    浏览(42)
  • Educoder/头歌JAVA实训——JAVA循环与分支语句编程练习

    为了完成本关任务,你需要掌握:1、数组的定义; 2、循环语句的熟练使用。 实现思路: 可以通过三层循环的方式,第一层循环用于控制百位数的变化,第二层循环用于控制十位数的变化,第三层循环用于控制个位数的变化。 由于题目要求百位数、十位数、个位数互不重复

    2023年04月08日
    浏览(76)
  • JavaScript上部分--头歌(educoder)实训作业题目及答案 JS简介

      目录 JS简介 第1关: JavaScript基础入门 第2关: JavaScript 与 HTML 第3关: JavaScript 变量 JS 数据类型 第1关: JavaScript 数据类型介绍 第2关: JavaScript 数据类型转换 JS运算符 第1关: 算术运算符 第2关: 比较和逻辑运算符 第3关: 条件和赋值运算符 第4关: 运算符的优先级和结合性 JS对象 第

    2023年04月22日
    浏览(166)
  • 头歌(educoder)实训作业题目及答案分享 ——1-4 Java入门 - 分支结构

    📜个人简介 :  作者简介:大家好,我是Passenger.n✌️  支持一下:点赞👍+收藏🌟+留言📪 📣 系列专栏:java基础🍁 ✉️格言:花有重开日,人无再少年!🌞 万事开头难,既然迈开了这一步,那就坚持走下去! 这是我的第一篇博客,希望萌新看了有收获,大佬看了给指

    2024年02月06日
    浏览(104)
  • 头歌Educoder实验:程序设计二(面向对象)_实训3_类外定义成员函数

    第1关:类外定义存取函数 任务描述 本关仍然有一个 Int 类,该类包含一个 int 类型的成员。为其编写存取函数。注意,存取函数要在类外实现。 相关知识 类的定义中,既可以书写成员函数的声明,也可以书写成员函数的定义(即实现)。如果在类中定义成员函数,则该成员

    2024年02月06日
    浏览(58)
  • 头歌(educoder)实训作业题目及答案分享 ——1-7 Java入门-分支与循环练习

    📜个人简介 :  作者简介:大家好,我是Passenger.n✌️  支持一下:点赞👍+收藏🌟+留言📪 📣 系列专栏:java基础🍁 ✉️格言:花有重开日,人无再少年!🌞 万事开头难,既然迈开了这一步,那就坚持走下去! 这是我的第一篇博客,希望萌新看了有收获,大佬看了给指

    2024年02月04日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包