模式匹配是个老概念了,它并不是函数式编程的必须内容,但函数式语言通常都实现了模式匹配,而大部分的命令式语言都空缺了这一块儿,所以给大家留下的印象就是模式匹配只在函数式编程中出现。
下面是一个常规的Fib编码:
public int fib(int n)
{
if (n < 2) return 1;
return fib(n - 2) + fib(n - 1);
}
// 伪代码
public int fib(int n)
{
PUSH_VARB n
PUSH_INT 2
CALC <
JMPF 0006: POP
PUSH_INT 1
RETURN [1]
0006:PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 2
CALC -
CALL [2]
PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 1
CALC -
CALL [2]
CALC +
RETURN [1]
RETURN
}
再看一下模式匹配的写法:
public int fib(int n ? n < 2) // 要求: n < 2
{
return 1;
}
public int fib(int n)
{
return fib(n - 2) + fib(n - 1);
}
// 伪代码
public int fib(int n)
{
PUSH_VARB n
PUSH_INT 2
CALC <
JMPF 0007: POP
PUSH_INT 1
RETURN [1]
RETURN
0007:PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 2
CALC -
CALL [2]
PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 1
CALC -
CALL [2]
CALC +
RETURN [1]
RETURN
}
对比两种编码的伪代码可以看出编译器对模式匹配函数自动添加了检测执行代码并进行了函数合并。一切就是这么简单。
模式匹配通常用于替代函数功能级的复杂分支语句,比如嵌套的
if语句或
switch语句。它的优点是在语法上实现了代码分离,有新的编码要求时只需增加新匹配模式或者删改已有的匹配模式即可,程序员无须维护一个复杂的分支函数。
下面举一个使用模式匹配的简单例子:
<html>
<head>
<title>查看</title>
</head>
<body>
<% ==> begin CGI
public void display(string table id_field content_field click_field ID)
{
// 显示内容
= sys::db().selectStr(@"SELECT %(content_field) FROM %(table)
WHERE %(id_field)='%(ID)'").html();
// 增加点击量
sys::db().execSQL(@"UPDATE %(table) SET %(click_field)=%(click_field)+1
WHERE %(id_field)='%(ID)'");
}
// 建立模式匹配
public void view(string cate ID ? cate == "news") // 新闻
{
display("news", "news_ID", "news_content", "news_clicks", ID);
}
public void view(string cate ID ? cate == "file") // 文章
{
display("files", "file_ID", "file_content", "file_view_count", ID);
}
public void view(string cate ID ? cate == "msg") // 消息
{
display("msgs", "msg_ID", "msg_content", "msg_clicks", ID);
}
// 执行模式匹配
view(${request.cate}, ${request.ID});
==> END CGI %>
</body>
</html>
是否使用模式匹配是个习惯问题,也是个经验问题,有时只是老板个人的问题。
从技术上讲,条件越复杂,模式匹配就越有用,这点是可以肯定的。
分享到:
- 2007-09-27 11:04
- 浏览 1410
- 评论(0)
- 论坛回复 / 浏览 (0 / 2434)
- 查看更多
相关推荐
本程序以C语言实现,提供了高效解决串的模式匹配的方法,具有很好的实用价值。 首先,我们要理解什么是串的模式匹配。在两个字符串中,一个称为主串(Text),另一个称为模式串(Pattern)。模式匹配问题就是在一个...
模式匹配中的KMP算法的实现 模式匹配是计算机科学领域中的一个研究热点,串的模式匹配算法是其中的一个重要分支。...通过了解KMP算法的原理和C语言实现,我们可以更好地理解模式匹配算法,并将其应用于实践中。
简单模式匹配算法 C语言实现简单模式匹配算法 C语言实现简单模式匹配算法 C语言实现
2. KMP模式匹配函数:该函数接收主串和模式串作为输入,使用已构建的next数组来进行匹配。主串与模式串的匹配比较,根据next数组来调整模式串的指针,从而实现快速匹配。 举个具体的代码例子,假设我们有一个模式串...
在实际编程实现中,KMP算法通常用C++、Java、Python等编程语言实现,通过对字符串进行迭代和条件判断,结合部分匹配表来完成高效的模式匹配。在本压缩包文件中,可能包含了用某种编程语言封装好的KMP算法实现,可供...
在计算机科学领域,字符串模式匹配是一项基础且重要的任务,它涉及到在文本中寻找特定模式的出现。本篇文章将深入探讨如何使用C++实现Bad Character Rule(坏字符规则)和Good Suffix Rule(好后缀规则)来优化Boyer...
模式匹配的KMP算法是计算机科学领域中的一种经典算法,具有广泛的应用前景,本课程设计旨在通过模式匹配的KMP算法的设计和实现,帮助学生深入了解数据结构、算法设计、程序实现等知识点,并提高学生的编程能力和问题...
本文将深入探讨两种经典的多模式匹配算法:Aho-Corasick (AC) 算法和 Wu-Manber (WM) 算法,并提供相关的实现及测试代码。 首先,我们来了解**Aho-Corasick (AC) 算法**。AC算法是在1975年由Aho、Corasick两位科学...
根据提供的标题、描述、标签及部分内容,我们可以提炼出与模式匹配相关的知识点,特别是关于一个简单的模式匹配算法在C++中的实现。以下是对这些知识点的详细解释: ### 模式匹配的简单算法 #### 1. 模式匹配基础...
字符串的模式匹配算法在计算机科学中占据着重要的地位,它主要应用于文本搜索、数据分析和文本处理等领域。KMP(Knuth-Morris-Pratt)算法是其中一种高效的算法,尤其适用于处理具有重复子串的模式匹配问题。接下来...
C# 8 引入了模式匹配的新特性,...尽管模式匹配和相关特性可以创建出简洁的代码,但也要注意保持代码的可读性和易于维护,避免过度使用复杂的嵌套模式。理解并适当地应用这些模式,将有助于提升C# 8 代码的质量和效率。
在这篇教学设计中,我们旨在帮助学生掌握KMP字符串模式匹配算法的基本概念和应用。通过本课例设计,学生将了解KMP算法的应用普遍性、实现机制和时间复杂度,并掌握计算next值的方法和判断算法优劣的方法。 一、教学...
在C#中,我们通常会使用循环和条件语句来实现基本的模式匹配。例如,朴素的模式匹配算法就是一个简单的方法,它通过比较每个字节来逐个检查文本是否包含目标模式。以下是一个简单的实现: ```csharp public static ...
总结来说,虽然JavaScript没有内置的模式匹配机制,但我们可以通过正则表达式、`switch`和`if`语句以及第三方库如`match-master`来实现类似的功能。这些工具和技巧能帮助开发者编写更简洁、更具可读性的代码,尤其是...
在这个主题中,我们将深入探讨两种常见的模式匹配算法:一般模式匹配和KMP(Knuth-Morris-Pratt)模式匹配,同时也会涉及C语言实现的相关知识。 1. 一般模式匹配: 一般模式匹配是最基础的字符串匹配方法,通常采用...
Brute Force 算法是一种简单的模式匹配算法,它通过比较主串和模式串的每个字符来实现模式匹配。该算法的思想是,从主串的第一个字符开始,逐个比较模式串的每个字符,如果匹配成功,则继续比较下一个字符,直到找到...
实验四的内容是基于这本书的一个实践部分,它要求学生设计和实现一种方法,以检测计算机中的病毒签名,这通常涉及字符串模式匹配算法。 字符串模式匹配算法的主要目标是在一个大文本(主字符串)中查找是否存在一个...
KMP模式匹配算法C语言实现程序KMP模式匹配算法C语言实现程序
为了提高模式匹配的速度和效率,研究人员提出了一系列改进算法,其中KMP算法(Knuth-Morris-Pratt algorithm)是较为著名的一种。 #### 二、KMP算法原理 ##### 2.1 基本思想 KMP算法的核心在于避免了传统模式匹配...