闭包的简单描述(closure)

概念:所谓闭包就是在一个函数的内部再嵌套一个函数

闭包就是能够读取其它函数内部变量的函数

闭包是将函数内部和函数外部连接起来的桥梁

以下是C语言实现ε-closure(I)的程序实现,已经注释了每个函数的作用。 ``` #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 20 // 状态集合的最大大小 int n; // 状态数 int m; // 字符数 int tran[MAX][MAX][MAX]; // 转移矩阵 int start; // 起始状态 int f[MAX]; // 结束状态集合 int cntf; // 结束状态数 int closure[MAX]; // 空闭包 int size; // 空闭包大小 // 初始化转移矩阵 void init() { memset(tran, -1, sizeof(tran)); } // 输入有限自动机 void input() { printf("请输入状态数和字符数:"); scanf("%d%d", &n, &m); printf("请输入转移关系:\n"); for (int i = 0; i < n; i++) { printf("请输入第%d个状态的转移关系:\n", i + 1); for (int j = 0; j < m; j++) { printf("请输入字符%d的转移状态:", j + 1); while (getchar() != '\n') continue; int k; scanf("%d", &k); if (k == -1) continue; tran[i][j][tran[i][j][MAX - 1]++] = k; } } printf("请输入起始状态:"); scanf("%d", &start); printf("请输入结束状态数:"); scanf("%d", &cntf); printf("请输入结束状态集合:"); for (int i = 0; i < cntf; i++) { scanf("%d", &f[i]); } } // 计算空闭包 void epsilon(int s) { closure[size++] = s; for (int i = 0; i < tran[s][m - 1][MAX - 1]; i++) { int t = tran[s][m - 1][i]; int flag = 0; for (int j = 0; j < size; j++) { if (closure[j] == t) { flag = 1; break; } } if (!flag) epsilon(t); } } // 计算状态集合的空闭包 void eclosure() { printf("请输入状态集合大小:"); int s; scanf("%d", &s); printf("请输入状态集合:"); int set[MAX]; for (int i = 0; i < s; i++) { scanf("%d", &set[i]); } // 计算每个状态的空闭包 for (int i = 0; i < s; i++) { epsilon(set[i]); } // 打印状态集合的空闭包 printf("状态集合的空闭包为:\n"); for (int i = 0; i < size; i++) { printf("%d ", closure[i]); } printf("\n"); } // 打印有限自动机 void output() { printf("有限自动机状态转换图:\n\n"); printf("digraph G {\n"); printf(" rankdir = LR;\n"); printf(" node [shape = circle];\n"); // 打印结点 for (int i = 0; i < n; i++) { printf(" %d", i); // 判断是否为起始状态 if (i == start) printf(" [style = filled, fillcolor = red]"); // 判断是否为结束状态 for (int j = 0; j < cntf; j++) { if (i == f[j]) { printf(" [style = filled, fillcolor = green]"); break; } } printf(";\n"); } // 打印边 for (int i = 0; i < n; i++) { for (int j = 0; j < m - 1; j++) { for (int k = 0; k < tran[i][j][MAX - 1]; k++) { int t = tran[i][j][k]; printf(" %d -> %d [label = \"%c\"];\n", i, t, j + 'a'); } } } printf("}\n"); } int main() { init(); input(); output(); eclosure(); return 0; } ``` 以上程序实现了输入任意给定的有限自动机,对该自动机的任意状态子集I,输出它的空闭包ε-closure(I)的功能。程序中包括输入有限自动机、计算空闭包、计算状态集合的空闭包、打印有限自动机等功能。运行程序时,先输入有限自动机的状态数和字符数,再输入转移关系,起始状态和结束状态集合等信息,即可得到有限自动机状态转换图并计算任意状态集合的空闭包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值