用python代码实现一个简单的FSA(有限状态自动机)

本文介绍如何使用状态转移表和Python实现一个简单的确定性有限状态自动机(FSA),用于识别仅包含大写字母和数字的字符串。
Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

前一篇文章介绍了什么是FSA以及用FSA识别字符串的基本原理。这篇文章就是基于状态转移表,用一个具体的例子讲一下一个简单的FSA如何用Python代码实现。
前一篇介绍FSA的文章:
链接: link.

回顾一下通过状态转移表理解FSA识别字符串的工作过程,一个状态转移表如下图:
在这里插入图片描述

它识别一个字符串的工作过程是:定义初始状态为0,接收状态为4,从初始状态0开始,如果输入b,则进入1状态,如果输入a或!则拒绝,识别失败,就这样一直到接收状态4,则整个字符串被接收,识别成功。

下图是利用状态转移表,用FSA识别字符串的算法:
在这里插入图片描述

这是一个确定性的FSA,所谓确定性的FSA,就是对于任何的输入,算法都有对应的下一步。进一步看一下上图的算法,该算法有三个结束状态:
①识别到最后一个字符,该字符会被接收,则返回True。
②识别到最后一个字符,该字符不被接收。返回False。
③还没识别到最后一个字符,该字符不被接收,返回False。

下面通过一个简单的例子,用python实现一下FSA。
题目是这样的:编写一个FSA,参照上图算法流程,要求仅能接收大写字母和数字。
这个题目用不用FSA很简单就可以实现,但这里我们要求用FSA来实现,其原理可以推广到用FSA识别更复杂的字符串。

分析一下解题步骤:
(1)确定待接收的字符:大写字母,数字。
(2)根据待接收字母确定状态:①初始状态0:指定的初始状态。②状态1:接收到字母或数字。
(3)用有向图分析状态转移的过程:
在这里插入图片描述

题目很简单,除了初始状态就一个状态,一直再状态1循环,知道接收完所有字符或者某个字符被拒绝。

下面看下具体的代码:

def is_digigit_upper(tape:str):
    """
    function:输入一个字符串,如果它只含大写字母和数字,返回True,否则返回False
    parameters:
        tape:要判断的tape
    date:2020/9/19
    author:IT'S 2AM
    return:True,false
    """
    #给出transition_table
    transition_table = [{'upper':1,'digit':1},  #初始状态
                       {'upper':1,'digit':1}]   #状态1
    current_state = 0;
    s = 0 #记录遍历tape的第几个元素
    for i in tape:
        if i.isdigit(): t = 'digit'
        elif i.isupper(): t = 'upper'
        else: t = 'other'
        if s == len(tape)-1:
            if t == 'digit' or 'upper':
                return True#情况一:读到tape最后一个元素,该元素依然符合要求,返回True
            else:
                return False#情况二:读到tape最后一个元素,该元素不符合要求,返回False
        elif t == 'other':
                return False#情况三:未到tape最后一个元素,该元素不符合要求,返回False
        else:
            current_state = transition_table[current_state][t]
        s = s+1

这里用了一个list来表示状态转移表,一共两个状态,初始状态和状态1。用t来表示接收到的字符属于哪一类,大写字母和数字被接收,其他情况被拒绝。

验证:

test_1 ='ABC'
print(is_digigit_upper(test_1))

结果:True

参考文章:
链接: link.

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

于2024年4月-2025年9月期间,研究团队在贵州习水国家级自然保护区制定39条样线,涵盖灌木林、常绿阔叶林、针叶林、常绿落叶阔叶混交林、针阔混交林等不同植被类型,每条样线分春夏秋冬4个季节采集样品,用真菌采集软件记录经纬度、海拔、采集地点、时间、生境等信息,使用佳能相机(R6 mark Ⅱ)对大型真菌进行拍照,并采集标本,标本存放于贵州省生物研究所大型真菌标本馆(HGAMF)。 通过形态学初步鉴定,结合分子生物学最终鉴定,参考已]报道的中国毒蘑菇名录开展毒蘑菇的认定。 调查到保护区内有毒真菌7目25科64种,导致中毒的主要类型有急性肾衰竭型、神经精神型和胃肠炎型。最终形成贵州习水国家级自然保护区大型有毒真菌图片数据集,它由以下2个部分组成。 (1)附件1包含78张原始照片(.JPG),照片名字包括了大型有毒真菌的拉丁名和中文名,若无中文名的直接用拉丁名。 (2)附件2是一个压缩文件,包含了2张工作表,其中一张表是大型有毒真菌39条样线的信息,另一张表是大型有毒真菌的中毒类型。 照片采用佳能相机R6 mark Ⅱ拍摄,物种鉴定通过多种文献核实,并经两位以上专家鉴定确认。该数据集可为研究地及周边的普通人识别有毒大型真菌提供参考,通过及时的图片对比,能有效避免误采误食大型有毒真菌,同时为因误食大型真菌可能引发的身体损伤进行了总结,能为患者及时治疗提供参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值