学期(2024-2025-1) 学号(20241428) 《计算机基础与程序设计》第7周学习总结
作业信息
|这个作业属于哪个课程|<班级的链接>(如[2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP|)|
|-- |-- |
|这个作业要求在哪里|<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)|
|这个作业的目标|数组与链表 基于数组和基于链表实现数据结构|
|作业正文|https://i.cnblogs.com/posts/edit|
教材学习内容总结
子程序与参数
定义和作用:
子程序可以是函数(Function)或过程(Procedure),函数通常返回一个值,而过程则不返回值。
子程序允许程序员将复杂的操作分解成更小、更易于管理的部分。
调用和返回:
子程序通过调用语句被执行,执行完毕后返回到调用点继续执行。
函数在执行完毕后会返回一个值给调用者,而过程则不会。
参数(Parameters):
参数是传递给子程序的值,用于影响子程序的行为。
参数可以是输入参数(传入值)、输出参数(传出值)或输入输出参数(传入传出值)。
参数传递方式:
按值传递(Pass by Value):子程序接收参数的副本,对参数的修改不会影响原始数据。
按引用传递(Pass by Reference):子程序直接操作参数的内存地址,对参数的修改会影响原始数据。
重载(Overloading):
允许创建多个具有相同名称但参数列表不同的子程序,这有助于提供更清晰的API和简化代码。
作用域(Scope):
子程序内部定义的变量通常具有局部作用域,即它们只能在子程序内部访问。
全局变量可以在程序的任何地方访问,包括子程序内部。
递归(Recursion):
递归是一种特殊的子程序调用,其中子程序直接或间接地调用自身。
递归需要有一个明确的终止条件,否则会导致无限递归。
栈帧(Stack Frame):
每次调用子程序时,都会在调用栈上创建一个新的栈帧,用于存储局部变量和参数。
当子程序返回时,其对应的栈帧会被销毁。
尾调用优化(Tail Call Optimization, TCO):
尾调用是指子程序调用是函数体中的最后一个操作。
尾调用优化是一种编译器优化技术,可以避免为尾调用创建新的栈帧,从而减少栈空间的使用。
闭包(Closures):
闭包是函数和其周围状态(词法环境)的组合,允许函数访问定义在其外部的变量。
这些知识点是编程中子程序和参数的基础,不同的编程语言可能会有不同的实现细节和特性。
连续内存分配:
数组在内存中分配一块连续的空间来存储数据元素。
随机访问:
数组支持通过索引进行快速随机访问,访问时间复杂度为O(1)。
固定大小:
静态数组的大小在定义时确定,不可更改。
动态数组(如C++中的std::vector或Java中的ArrayList)可以调整大小,但通常需要分配新的内存块并复制旧数据。
插入和删除操作:
在数组的开头或中间插入或删除元素通常需要移动大量元素,时间复杂度为O(n)。
空间利用:
数组可能会预留额外空间以支持动态扩展,这可能导致空间的浪费或不足。
缓存友好性:
数组的连续内存分配使得缓存利用率高,有助于提高性能。
适用场景:
适用于元素数量基本确定且需要频繁随机访问的场景。
基于链表的数据结构
非连续内存分配:
链表中的每个元素(节点)可以独立分配在内存的任何位置。
顺序访问:
链表只能通过从头节点开始顺序访问,访问特定节点的时间复杂度为O(n)。
动态大小:
链表的大小可以随时改变,插入和删除操作不需要移动其他元素。
插入和删除操作:
在链表的任意位置插入或删除节点只需要改变指针,时间复杂度为O(1),但前提是已经定位到该位置。
空间利用:
链表不需要预留额外空间,但每个节点需要额外存储指向前一个或后一个节点的指针,可能会增加存储开销。
缓存友好性:
链表的非连续内存分配可能导致缓存未命中,影响性能。
适用场景:
适用于元素数量频繁变化且顺序访问的场景,如实现栈、队列等。
常见基于数组和链表的数据结构
数组实现:
数组列表(ArrayList)
哈希表(如C++中的std::unordered_map)
字符串(在某些语言中,如C/C++)
链表实现:
单链表
双向链表
循环链表
哈希链表(开放寻址法)
栈(可以使用数组或链表实现)
队列(可以使用数组或链表实现)
教材学习中的问题和解决过程(先问 AI)