为了账号安全,请及时绑定邮箱和手机立即绑定
Image

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 96
讨论题

龙井1 的学生作业:

在分布式、多实例的ROS2(Robot Operating System 2)架构中,单例模式可能并不总是最佳选择。单例模式确保一个类只有一个实例,并提供一个全局访问点。这种设计模式在需要全局唯一性或资源受限的情况下非常有用。然而,在分布式系统中,尤其是在像ROS2这样强调模块化和松耦合的系统中,单例模式可能会带来一些挑战。 单例模式解决了什么问题 资源共享:单例模式可以确保某些资源(如日志配置)在整个应用程序中被共享,这有助于减少内存占用。 一致性:通过保证单一实例,单例模式可以帮助维持状态的一致性。 简化访问:提供了对单一实例的简单访问方法,无需创建多个对象。 在分布式、多实例的ROS2架构中引入的问题 生命周期管理:在复杂的分布式系统中,单例的生命周期管理变得复杂,尤其是当不同节点的启动和关闭时间不一致时。 测试隔离性:单例使得单元测试变得困难,因为它们持有全局状态,这违反了单元测试中的隔离原则。 线程安全:虽然单例自身可以通过同步机制来实现线程安全,但在并发环境下,如果多个线程试图同时修改单例的状态,则仍可能存在竞态条件。 跨节点一致性:在一个多节点的ROS2系统中,使用单例可能导致不同节点间的配置冲突,因为每个节点都尝试访问同一个日志配置,而这些配置可能根据节点的需求是不同的。 更好的替代方案 依赖注入:这是一种更灵活的设计模式,它允许你将依赖关系传递给需要它们的对象,而不是让对象自己去创建。依赖注入框架可以很好地支持动态配置以及更好的测试隔离性。 工厂模式:通过工厂模式,你可以为每个节点创建独立的日志实例,这样就可以避免配置冲突。 配置服务:可以在ROS2系统中设置一个专门的配置服务,该服务负责管理所有节点的日志配置。这样,每个节点都可以从配置服务请求自己的日志配置,从而保持配置的一致性和可管理性。 上下文特定单例:对于确实需要单例的情况,可以考虑使用基于上下文的单例,比如每个节点拥有自己的日志单例,而不是整个系统共享一个。 总之,虽然单例模式有其优点,但在像ROS2这样的分布式系统中,它带来的问题往往超过了其优势。采用诸如依赖注入等更加灵活的方法通常会更适合此类场景,以提高系统的可维护性、可测试性和整体性能。

得分 96
讨论题

EarthaVictory 的学生作业:

列表(list)和元组(tuple)看起来都只是“装数据的容器”,但它们在设计哲学上其实是两种完全不同的东西:一个强调“可变操作”,一个强调“稳定不变”。 可变性(最核心区别) 列表(list) 可变(mutable) lst = [1, 2, 3] lst[0] = 10 lst.append(4) 可以随时改、加、删 元组(tuple)不可变(immutable) 一旦创建,内容就不能变 频繁操作数据 → 用 list 数据是“常量” → 用 tuple 语法表示 列表用 [] lst = [1, 2, 3] 元组用 () t = (1, 2, 3) 特殊点: t = (1,) # 单元素元组必须加逗号 本质区别: 元组其实不是“括号”,而是“逗号”定义的 操作能力差异 列表支持大量修改操作: lst.append(x) lst.insert(i, x) lst.remove(x) lst.pop() lst.sort() 元组几乎只能查询: t.count(x) t.index(x) 元组 ≈ 只读结构 列表 ≈ 可编辑容器 性能与内存 元组 更轻量 占用内存更少 访问速度略快 列表 更灵活 但开销稍大 因为元组不可变,Python 可以做更多优化 是否可以作为字典 key(重要区别) d = {} d[(1, 2)] = “ok” # tuple 可以 d[[1, 2]] = “no” # list 不行 原因: 字典 key 必须“可哈希” 只有不可变对象(如 tuple)才可以 使用场景对比 适合用 list 的场景 数据会变化 需要增删改 数据规模不固定 比如: 用户列表 订单集合 动态数据流 适合用 tuple 的场景 数据是固定结构 不希望被修改(安全性) 作为字典 key 表示“一个整体” 更深一层理解(很多人忽略) list 是“数据集合” tuple 是“数据结构/记录” 换句话说: list 更像: “一堆可以随时变的东西” tuple 更像: “一个固定含义的组合” 总结: list:可变、灵活、适合频繁操作 tuple:不可变、安全、适合固定结构

得分 100
学习任务

Latesumme 的学生作业:

练习1: #include #include #include #define N 6 typedef struct tree_node { int n; struct tree_node *left; struct tree_node *right; }tree_node; tree_node *create_tree_node(int n) { if(n > N) return NULL; tree_node *root = NULL; root = (tree_node *)malloc(sizeof(tree_node)); memset(root,0,sizeof(tree_node)); root->left = root->right = NULL; root->n = n; if(2 * n left = create_tree_node(2 * n); if(2 * n + 1 right = create_tree_node(2 * n + 1); return root; } int tree_deep(tree_node *root) { if(root == NULL) return 0; int left_deep = tree_deep(root->left); int right_deep = tree_deep(root->right); return (left_deep > right_deep ? left_deep : right_deep) + 1; } void tree_free(tree_node *root) { if(root == NULL) return; tree_free(root->left); tree_free(root->right); free(root); } int main() { tree_node *root = NULL; root = create_tree_node(1); printf("%d\n",tree_deep(root)); tree_free(root); return 0; } 练习2: #include #include #include typedef struct linknode { int data; struct linknode *next; }linknode_t; linknode_t *create_linknode_t() { linknode_t *head = NULL; head = (linknode_t *)malloc(sizeof(linknode_t)); memset(head,0,sizeof(linknode_t)); head->next = NULL; return head; } void input_linknode(linknode_t *head,int data) { linknode_t *new = NULL; new = (linknode_t *)malloc(sizeof(linknode_t)); new->data = data; new->next = NULL; linknode_t *p = head; while(p->next != NULL){ p = p->next; } p->next = new; } void sort_linklist(linknode_t *head) { if(head == NULL || head->next == NULL) return ; for(linknode_t *p = head->next; p != NULL; p = p->next){ for(linknode_t *q = p->next; q != NULL; q = q->next){ if(p->data >q->data){ p->data ^= q->data; q->data ^= p->data; p->data ^= q->data; } } } } void output(linknode_t *head) { linknode_t *p = head->next; while(p){ printf("%d ",p->data); p = p->next; } printf("\n"); } int main() { linknode_t *head = NULL; head = create_linknode_t(); printf("请输入5个数字:\n"); int a; for(int i = 0; i < 5; i++){ scanf("%d",&a); input_linknode(head,a); } printf("排序前:"); output(head); sort_linklist(head); printf("排序后:"); output(head); free(head); head = NULL; return 0; } 练习3 #include #include // 单向链表节点结构体(和你之前的代码完全一致) typedef struct linknode { int data; struct linknode *next; } linknode_t; // head1: 1 3 5 7 9 // head2: 2 4 6 8 10 // 合并后: 1 2 3 4 5 6 7 8 9 10 linknode_t *and_linklist(linknode_t *head1, linknode_t *head2) { // 1. 边界处理:如果其中一个链表为空,直接返回另一个 if (head1 == NULL) return head2; if (head2 == NULL) return head1; // 2. 创建虚拟头节点(dummy head),简化头节点处理 linknode_t dummy; linknode_t *p = &dummy; // p 用来遍历,构建新链表 // 3. 双指针遍历两个链表,按大小拼接 while (head1 != NULL && head2 != NULL) { if (head1->data data) { p->next = head1; // 把小的节点挂到新链表 head1 = head1->next; // head1 后移 } else { p->next = head2; // 把小的节点挂到新链表 head2 = head2->next; // head2 后移 } p = p->next; // 新链表指针后移 } // 4. 把剩余未遍历完的链表直接挂到末尾 if (head1 != NULL) p->next = head1; if (head2 != NULL) p->next = head2; // 5. 返回虚拟头节点的下一个节点,就是合并后的链表头 return dummy.next; } // 创建链表(尾插法) linknode_t *create_linklist(int arr[], int len) { if (len == 0) return NULL; linknode_t *head = NULL, *tail = NULL, *new = NULL; for (int i = 0; i < len; i++) { new = (linknode_t *)malloc(sizeof(linknode_t)); new->data = arr[i]; new->next = NULL; if (head == NULL) head = tail = new; else { tail->next = new; tail = new; } } return head; } // 打印链表 void print_linklist(linknode_t *head) { linknode_t *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 释放链表 void free_linklist(linknode_t *head) { linknode_t *tmp = NULL; while (head != NULL) { tmp = head; head = head->next; free(tmp); } } // 主函数测试 int main() { int arr1[] = {1, 3, 5, 7, 9}; int arr2[] = {2, 4, 6, 8, 10}; int len1 = sizeof(arr1) / sizeof(arr1[0]); int len2 = sizeof(arr2) / sizeof(arr2[0]); linknode_t *head1 = create_linklist(arr1, len1); linknode_t *head2 = create_linklist(arr2, len2); printf("链表1:"); print_linklist(head1); printf("链表2:"); print_linklist(head2); linknode_t *new_head = and_linklist(head1, head2); printf("合并后:"); print_linklist(new_head); free_linklist(new_head); return 0; } 练习4:【图片】

首页上一页1234567下一页尾页
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号