消除左递归实验报告

合集下载

消除文法的左递归实验

消除文法的左递归实验

消除⽂法的左递归实验编译原理实验报告实验名称 _____________ 消除⽂法的左递归__________________________ 实验时间_____________________________________________院系 _________________________________________班级 ______________________________________________学号 ____________________________________________姓名1. 试验⽬的掌握和理解消除左递归(包括直接左递归和间接左递归)在构建LL(1)⽂法的作⽤和⽬的掌握消除左递归(包括直接左递归和间接左递归)的⽅法和步骤。

写出对于输⼊任意的上下⽂⽆关⽂法可以输出消除了左递归的等价⽂法。

2. 实验原理直接左递归的消除消除产⽣式中的直接左递归是⽐较容易的。

例如假设⾮终结符P的规则为P—P a/ B其中,B是不以P开头的符号串。

那么,我们可以把P的规则改写为如下的⾮直接左递归形式:P—⼫’P'—P'£考虑更⼀般的情况,假定关于⾮终结符P的规则为P—P a / P o2 / …/ P a n / [31 / [32 / …/ p m其中,a (I = 1, 2,…,n)都不为£⽽每个p j (j = 1, 2,…,m) 都不以P开头,将上述规则改写为如下形式即可消除P的直接左递归:P— p l P'/ 32 P'/…/p m P'P' — 01P' / a P'/…/ a n P'/£间接左递归的消除直接左递归见诸于表⾯,利⽤以上的⽅法可以很容易将其消除, 即把直接左递归改写成直接右递归。

然⽽⽂法表⾯上不存在左递归并不意味着该⽂法就不存在左递归了。

有些⽂法虽然表⾯上不存在左递归,但却隐藏着左递归。

编译原理消除左递归和公因子

编译原理消除左递归和公因子

编译原理消除左递归和公因子哎呀,编译原理这门课,听起来就像是一道难啃的硬骨头。

你想,编译器就像是一个聪明的翻译官,把我们写的代码翻译成计算机能理解的语言。

可在这过程中,左递归和公因子可就成了我们的“拦路虎”。

左递归,顾名思义,就是那种在规则里面,自我调用的情况。

就像是一个爱走回头路的小孩,走着走着就又回到了起点。

这玩意儿可是会让我们的解析器绊倒,真的是无处可逃。

想象一下,如果你在学习一门新技能,总是回到最开始的地方,那得多烦人啊。

所以,咱们得找办法把它给解决掉。

最常见的方式就是重写规则。

比如说,原本我们有个规则叫做A > Aα | β,哎呀,这个左递归可真让人头疼。

我们可以把它转变成A > βA',然后再来个A' > αA' | ε。

看,没了左递归,简直像是畅通无阻的高速公路,通行无阻,速度飞快。

再说说公因子。

这个问题就像是大家一起唱歌,但总有一些人嗓音特好,想把大伙儿都带起来。

比如我们有A > αβ | αγ,哎呀,这里就能看到α 是个公因子。

于是,咱们也得给它处理一下。

我们可以把它改成A > αA',然后A' > β | γ。

这样一来,所有人都能在同一个调子上合唱,和谐得很。

大家心情大好,编译器的效率也提升了,简直是双赢的局面。

这些概念一上来,真的会让人感觉天花乱坠。

可掌握这些小技巧,就能让你在编译原理的海洋里遨游。

左递归和公因子这两个家伙,别看它们名字听起来高大上,实际上我们可以把它们看成是学习过程中的小石头,捡起来扔掉就是了。

编译原理的学习,就像是打怪升级。

前面有大boss,你得先学会基本的技能,才能有机会挑战它。

左递归和公因子就是那些小怪,打掉它们,你才能顺利通关。

掌握这些技巧,随时随地都能应对各种问题,真的是如鱼得水。

我知道,有些同学可能一开始看这些规则就头大。

别怕,慢慢来,像吃火锅一样,先从底料开始,慢慢加入各种配菜。

编译原理实验二:消除文法的左递归.doc

编译原理实验二:消除文法的左递归.doc

编译原理实验报告实验名称消除文法的左递归实验时间2013年11月12日院系计算机科学与电子技术系班级11计算机软件学号JV114001 JV114095 JP114065 姓名唐茹韩强强徐思维1.试验目的:输入:任意的上下文无关文法。

输出:消除了左递归的等价文法。

2.实验原理:1.直接左递归的消除消除产生式中的直接左递归是比较容易的。

例如假设非终结符P 的规则为:P →P α / β其中,β是不以P 开头的符号串。

那么,我们可以把P 的规则改写为如下的非直接左递归形式: P →βP ’P ’→αP ’ / ε这两条规则和原来的规则是等价的,即两种形式从P 推出的符号串是相同的。

设有简单表达式文法G[E]: E →E+T/ T T →T*F/ F F →(E )/ I经消除直接左递归后得到如下文法: E →TE ’E ’ →+TE ’/ ε T →FT ’T ’ →*FT ’/ εF →(E )/ I考虑更一般的情况,假定关于非终结符P 的规则为P →P α1 / P α2 /…/ P αn / β1 / β2 /…/βm其中,αi (I =1,2,…,n )都不为ε,而每个βj (j =1,2,…,m )都不以P 开头,将上述规则改写为如下形式即可消除P 的直接左递归:P →β1 P ’ / β2 P ’ /…/βm P ’P ’ →α1P ’ / α2 P ’ /…/ αn P ’ /ε 2.间接左递归的消除直接左递归见诸于表面,利用以上的方法可以很容易将其消除,即把直接左递归改写成直接右递归。

然而文法表面上不存在左递归并不意味着该文法就不存在左递归了。

有些文法虽然表面上不存在左递归,但却隐藏着左递归。

例如,设有文法G[S]:S →Qc/ c Q →Rb/ b R →Sa/ a虽不具有左递归,但S 、Q 、R 都是左递归的,因为经过若干次推导有 S ⇒Qc ⇒Rbc ⇒SabcQ ⇒Rb ⇒Sab ⇒Qcab R ⇒Sa ⇒Qca ⇒Rbca就显现出其左递归性了,这就是间接左递归文法。

消除左递归实验报告

消除左递归实验报告

一、实验目的1. 理解左递归的概念及其对语法分析的影响。

2. 掌握消除左递归的方法,包括直接左递归和间接左递归的消除。

3. 能够运用消除左递归的方法对实际文法进行处理,提高语法分析的效率。

二、实验原理1. 左递归的定义:在上下文无关文法中,若存在产生式A→αAβ,其中α和β是符号串,且α不包含非终结符A,则称A产生式具有左递归。

2. 左递归的影响:左递归会导致语法分析过程中产生死循环,影响分析效率。

3. 消除左递归的方法:(1)直接左递归的消除:将具有直接左递归的文法转换为不具有直接左递归的文法。

(2)间接左递归的消除:将具有间接左递归的文法转换为不具有间接左递归的文法。

三、实验内容1. 实验环境:Python 3.72. 实验工具:Pylint、Jupyter Notebook3. 实验步骤:(1)定义文法:使用字符串表示文法,其中非终结符用大写字母表示,终结符用小写字母表示,产生式用“→”连接。

(2)检测左递归:编写函数检测文法中是否存在左递归,包括直接左递归和间接左递归。

(3)消除左递归:根据检测到的左递归类型,编写函数消除文法中的左递归。

(4)输出结果:将消除左递归后的文法输出。

四、实验过程1. 定义文法:G[E] = E→E+E | E-E | T | id2. 检测左递归:经过检测,发现文法G[E]中存在直接左递归。

3. 消除左递归:(1)消除直接左递归:将产生式E→E+E改写为E→T+E',其中E'表示E的剩余部分。

(2)消除间接左递归:将产生式E→T+E'中的T进行递归消除,得到T→id+T',其中T'表示T的剩余部分。

4. 输出结果:消除左递归后的文法为G'[E] = E→T+E' | T | id,T→id+T',E'→+E | -E | ε。

五、实验结果分析1. 通过消除左递归,将原始文法G[E]转换为G'[E],提高了语法分析的效率。

递归下降分析实验报告

递归下降分析实验报告

一、实验目的通过本次实验,加深对递归下降分析法的理解,掌握递归下降分析法的原理和应用,并能够根据给定的文法编写相应的递归下降分析程序。

二、实验原理递归下降分析法是一种自顶向下的语法分析方法,它将文法中的每个非终结符对应一个递归过程(函数),分析过程就是从文法开始符触发执行一组递归过程(函数),向下推到直到推出句子。

递归下降分析法的前提是文法应满足以下条件:1. 消除二义性:确保文法中每个产生式都只有一个确定的意义。

2. 消除左递归:避免产生式出现如A -> A...A的形式。

3. 提取左因子:将产生式中的左因子提取出来,避免出现左递归。

4. 判断是否为LL(1)文法:LL(1)文法是指文法满足左递归和右递归的文法。

三、实验内容1. 根据给定的文法编写递归下降分析程序。

2. 对输入的符号串进行分析,判断其是否属于该文法。

3. 输出分析过程和结果。

四、实验步骤1. 阅读相关资料,了解递归下降分析法的原理和应用。

2. 根据给定的文法,设计递归下降分析程序的结构。

3. 编写递归下降分析程序,实现分析过程。

4. 编写测试用例,验证递归下降分析程序的正确性。

5. 分析实验结果,总结实验经验。

五、实验结果与分析1. 实验结果根据给定的文法,编写了递归下降分析程序,并进行了测试。

以下为部分测试用例及结果:(1)输入:eBaA输出:分析成功,属于该文法。

(2)输入:abAcB输出:分析成功,属于该文法。

(3)输入:dEdaC输出:分析成功,属于该文法。

(4)输入:edc输出:分析成功,属于该文法。

2. 实验分析通过本次实验,我们深入了解了递归下降分析法的原理和应用。

在编写递归下降分析程序的过程中,我们学会了如何根据文法设计程序结构,以及如何实现分析过程。

同时,我们还掌握了如何对输入的符号串进行分析,并输出分析结果。

实验过程中,我们遇到了一些问题,如消除二义性、消除左递归、提取左因子等。

通过查阅资料和不断尝试,我们成功解决了这些问题。

递归实验报告分析总结

递归实验报告分析总结

递归实验报告分析总结递归是一种非常重要的编程思想和技巧,对于理解和解决问题具有非常大的帮助。

通过递归,我们可以将一个问题分解成为更小的子问题,从而简化问题的复杂度和难度。

在本次实验中,我深入学习了递归的原理和应用,并实践了一些递归算法。

通过这些实验,我对递归有了更深入和全面的理解,掌握了递归的使用方法和注意事项。

在实验中,我首先学习了递归的概念和原理。

递归是一种将大问题分解成小问题的算法思想,通过不断调用自己来解决问题。

递归算法通常包含两个部分:基本情况和递归情况。

基本情况是递归终止的条件,递归情况是递归调用自身的条件。

通过合理设置这两个条件,我们可以确保递归算法能够得到正确的结果并正常终止。

然后,我练习了递归的应用。

在实验中,我实现了一些常见的递归算法,如计算阶乘、斐波那契数列等。

通过这些实践,我更加熟悉了递归的写法和思维模式。

递归算法的核心思想是将大问题分解成小问题,然后通过递归调用解决这些小问题,最终得到整个问题的解。

这种思维模式非常灵活和高效,对于解决一些复杂和抽象的问题非常有帮助。

在实验过程中,我也遇到了一些递归算法的常见问题和注意事项。

例如,递归算法容易出现堆栈溢出的问题,因为每次递归调用都会占用一定的内存空间,如果递归层数过多,就容易导致栈溢出。

为了解决这个问题,我们可以在递归算法中加入递归深度的限制条件,或者考虑使用迭代算法等其他算法思想。

此外,递归算法的时间复杂度一般比较高,因为递归算法需要不断的调用自身,导致函数的调用次数非常多。

为了提高递归算法的效率,我们可以尝试使用尾递归优化、记忆化搜索等技巧。

尾递归优化是指在递归函数的最后一步调用中,直接返回递归函数的结果,而不再进行其他操作。

这样可以有效避免函数调用的堆栈积累,提高程序的性能。

总的来说,通过本次递归实验,我对递归算法有了更深入的理解和掌握。

递归是一种非常强大和灵活的算法思想,可以用来解决各种复杂的问题。

通过合理设置递归的基本情况和递归情况,我们可以通过递归算法简化问题的复杂度和难度,高效地解决问题。

编译原理实验报告二

编译原理实验报告二

深圳大学实验报告课程名称:编译原理实验项目名称:语法分析--递归下降法学院:计算机与软件专业:软件工程指导教师:张小建报告人:文成学号:2011150259 班级: 2 实验时间:2013-12-25实验报告提交时间:2013-12-26教务部制一、实验目的:掌握自顶向下的语法分析法——递归下降法。

二、实验内容:用递归下降法对如下所定义的逻辑表达式进行语法分析。

1 L→ L || A2 L→ A3 A→ A && R4 A→ R5 R→ [ L ]6 R→ ! L7 R→ E >= E8 R→ E > E9 R→ E <= E10 R→ E < E11 R→ E == E12 R→ E != E13 R→ E14 E→ E + T15 E→ T16 T→ T * F17 T→ F18 F→ ( E )19 F→ n // 数20 F→ i // 标识符三、实验设计:1、消除该文法的左递归(产生式1、3、14、16);产生式(1)L→ L || A (2)L→ A消除左递归得到:L→ A L' L'→ || A L' | з产生式(3)A→ A && R (4)A→ R消除左递归得到:A→ RA' A'→ && RA' | з产生式(14)E→ E + T (15)E→ T消除左递归得到:E→ TE' E'→ + TE' | з产生式(16)T→ T * F (17)T→ F消除左递归得到:T→ FT' T'→ *FT' | з2、通过抽取公共左因子(产生式7 ~ 12),对该文法进行LL(1)改造;产生式7~127 R→ E >= E8 R→ E > E9 R→ E <= E10 R→ E < E11 R→ E == E12 R→ E != E抽取公共左因子:R→ ER'R'→ >=E | >E | <=E | <E | ==E | !=E3、证明最终得到的文法为LL(1)文法。

消除左递归的方法

消除左递归的方法

消除左递归的方法一、什么是左递归?在语法分析中,左递归是指产生式中左部直接或间接递归调用了自身的情况。

简单来说,就是一个非终结符的产生式中,左侧第一个符号又是该非终结符本身的情况。

在以下产生式中,非终结符A存在左递归:A -> Ab | cA的第一个符号是A本身。

左递归可能会导致递归下降解析器进入无限递归,导致程序崩溃或死循环。

在编写解析器时,需要消除所有的左递归。

二、消除左递归的方法1. 直接左递归消除方法对于直接左递归的产生式A -> Aα | β,可以通过以下步骤消除左递归:1)将产生式改写为A -> βA',A' -> αA' | ε。

2)将产生式进行分割,得到以下两个产生式:A -> βA'A' -> αA' | εε表示空产生式。

对于以下产生式:A -> Aa | b可以通过直接左递归消除方法得到以下产生式:A -> bA'A' -> aA' | ε2. 间接左递归消除方法对于间接左递归的产生式,可以通过以下步骤消除左递归:1)将所有非直接左递归的产生式移至左边,所有直接左递归的产生式移至右边。

2)将每个非终结符的所有产生式按照首符号分成两个集合,一个集合为直接或间接以该非终结符开始的产生式,另一个集合为不以该非终结符开始的产生式。

3)对于每个集合,递归地消除左递归。

4)将消除左递归后的产生式合并到一起。

对于以下文法:A -> BcB -> Ad | e可以通过间接左递归消除方法得到以下产生式:B -> eB'B' -> dB' | εA -> eB'c | dcB'是在消除左递归后新增加的符号。

三、消除左递归的示例以下为一个简单的文法:S -> S + S | S * S | id该文法存在直接左递归S -> S + S和S -> S * S,因此需要进行消除。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

共享知识分享快乐编译原理实验报告实验名称消除文法左递归实验时间2014年12月12日院系软件工程 ______________班级软件工程(2)班学号E01214215 __________姓名刘翼________________实验目的:输入:任意的上下文无关文法。

输出:消除了左递归的等价文法。

实验原理:1.直接左递归的消除消除产生式中的直接左递归是比较容易的。

例如假设非终结符P 的规则为P—P a / B其中,B是不以P开头的符号串。

那么,我们可以把P的规则改写为如下的非直接左递归形式:P —B P'P'—a P' / £这两条规则和原来的规则是等价的,即两种形式从P推出的符号串是相同的。

设有简单表达式文法G[E] :E —E+T/ TT —T*F/ FF —(E)/ I经消除直接左递归后得到如下文法:E —TE'E ' —+TE' / £T —FT'T' —*FT' / £F —(E)/ I考虑更一般的情况,假定关于非终结符P的规则为P—P a 1 / P a 2 / …/ P a n / B 1 / B 2 / …/ B m 其中,a i (I = 1,2,…,n)都不为£,而每个B j (j = 1,2,…,m都不以P开头,将上述规则改写为如下形式即可消除P的直接左递归:P—B 1 P' / B 2 P' / …/ B m P'P' —a 1P' / a 2 P' / …/ a n P' / £2.间接左递归的消除直接左递归见诸于表面,利用以上的方法可以很容易将其消除,即把直接左递归改写成直接右递归。

然而文法表面上不存在左递归并不意味着该文法就不存在左递归了。

有些文法虽然表面上不存在左递归,但却隐藏着左递归。

例如,设有文法G[S] :S—Qc/ cQ—Rb/ bR—Sa/ a虽不具有左递归,但S、Q R都是左递归的,因为经过若干次推导有S Qc Rbc SabcQ Rb Sab QcabR Sa Qca Rbca就显现出其左递归性了,这就是间接左递归文法消除间接左递归的方法是,把间接左递归文法改写为直接左递归文法,然后用消除直接左递归的方法改写文法。

如果一个文法不含有回路,即形如P P的推导,也不含有以&为右部的产生式,那么就可以采用下述算法消除文法的所有左递归。

消除左递归算法:(1)把文法G的所有非终结符按任一顺序排列,例如,A i, A,…,A。

(2)for (i = 1 ;i<=n ;i++ )for (j = 1; j<=i —1; j++ ){ 把形如A f A丫的产生式改写成A i 1丫/ S' 2丫/…/ S' kY其中A fS 1 / S 2 /…/ S k是关于的A全部规则;消除A i 规则中的直接左递归;}(3)化简由( 2)所得到的文法,即去掉多余的规则。

利用此算法可以将上述文法进行改写,来消除左递归。

首先,令非终结符的排序为R、Q S。

对于R,不存在直接左递归。

把R代入到Q中的相关规则中,贝U Q的规则变为Sab/ ab/ b。

代换后的Q不含有直接左递归,将其代入S,S的规则变为S f Sabc/ abc/ be/ c。

此时,S存在直接左递归。

在消除了S的直接左递归后,得到整个文法为:S f abcS'/ bcS'/ cS'S' f abeS'/ &Q f Sab/ ab/ bR f Sa/ a可以看到从文法开始符号S出发,永远无法达到Q和R,所以关于Q和R的规则是多余的,将其删除并化简,最后得到文法G[S]为:S f abeS'/ beS ' / eS'S' f abeS'/ £当然如果对文法非终结符排序的不同,最后得到的文法在形式上可能不一样,但它们都是等价的。

例如,如果对上述非终结符排序选为S、Q R,那么最后得到的文法G[R]为:R f beaR'/ eaR'/ aR 'R' f beaR'/ £容易证明上述两个文法是等价的。

实验内容:指明是否存在左递归,以及左递归的类型。

对于直接左递归,可将其改为直接右递归;对于间接左递归(也称文法左递归),则应按照算法给出非终结符不同排列的等价的消除左递归后的文法。

(应该有n!种) 实验代码与结果:#include<stdio.h>#include<stdlib.h> #include<string.h> #define N 20 char P[N][N]; // 存放文法 char Q[N]; // 存放非终结符char R[N][N]; // 存放含有间接左递归的产生式 char str[N][N], str1[N][N];int sp[N]; // 标记无用的产生式 int r , count=0,count1=0;int direct(char P[N][N]); int indirect(char P[N][N]);void directRemove(char P[N][N]); void indirectRemove(char P[N][N]); void perm(char str[N][N], int i, int n); int main(){printf(" 请输入文法 P 产生式的个数 : "); scanf("%d/n",&r);printf(" 请输入各条产生式,产生式的左部跟右部用 -> 连接 :\n"); for(int k=0;k<r;k++){scanf("%s",P[k]); if(strlen(P[k])==4) strcpy(str1[count1++],P[k]); else strcpy(str[count++],P[k]);}if(direct(P)==1) directRemove(P);else if(indirect(P)==2) perm(str , 0, count-1); elseprintf(" 经判断该文法不含有左递归 !\n"); return 0;}int direct(char P[N][N]){int flag=0;// 判断直接左递归// 判断间接左递归 // 消除直接左递归 // 消除间接左递归 // 实现全排列{{if(P[i][3]==P[i][0]){flag++; break;}}if(flag>0){printf(" 经判断该文法含有直接左递归 return 1;}elsereturn 0;}int indirect(char P[N][N]){int flag=0;for(int i=0;i<r;i++){for(int k=1;k<r;k++){if(P[i+k][0]==P[i][3]){flag++; break;}}if(flag>0)break;}if(flag>0){printf(" 经判断该文法含有间接左递归 return 2;}elsereturn 0;}void directRemove(char P[N][N])int k,j=4;memset(sp,0,sizeof(sp)); for(int i=0;i<r;i++){if(P[i][3]==P[i][0]){P[i][3]=P[i][2];P[i][2]=P[i][1]; P[i][1]='\'';while(P[i][j]!=0)j++; P[i][j]=P[i][0]; P[i][j+1]='\'';sp[i]=1; for(k=0;k<4;k++) P[r][k]=P[i][k];!\n");!\n");sp[r]=1;}else{j=3;while(P[i][j]!=0)j++;P[i][j]=P[i][0];P[i][j+1]='\'';sp[i]=1;}}printf("\n 消除直接左递归后的文法为:\n");for(int t=0;t<r+1;t++){if(sp[t]==1)printf("%s\n",P[t]);}}void indirectRemove(char P[N][N]){int flag,flag1=0,r1=r;int i,j,k,t,e=0,g=0;Q[e]=P[e][0];for(i=1;i<r;i++)int flag=0;for(int k=0;k<=e;k++)if(P[i][0]!=Q[k])flag++;if(flag==(e+1)){e++;Q[e]=P[i][0];}}printf("\n 非终结符序列为:%s\n", Q);for(j=0;j<e;j++){int number=0;for(int z=0;z<r;z++)if(P[z][0]==Q[j])number++;if(number>1)r1++;for(i=0;i<r;i++){for(k=1;k<r;k++){if((P[i][0]==P[i+k][3])&&(flag1==0)){for(int y=0;P[i+k][y]!=0;y++) {共享知识分享快乐{R[g][y]=P[i+k][y]; flag1=1; int m=3; while(P[i][m]!=0) m++;int t=m-3;int n=4;while(P[i+k][n]!=0)n++;for(int s=n-1;s>=4;s--)P[i+k][s+t-1]=P[i+k][s];for(int u=3;u<3+t;u++)P[i+k][u]=P[i][u];break;}else if((P[i][0]==R[g][3])&&(flag1==1))共享知识分享快乐{for(int y=0;R[g][y]!=0;y++)P[r1-1][y]=R[g][y]; int m=3; while(P[i][m]!=0) m++; int t=m-3; int n=4; while(P[r1-1][n]!=0) n++;for(int s=n-1;s>=4;s--)P[r1-1][s+t-1]=P[r1-1][s];for(int u=3;u<3+t;u++)P[r1-1][u]=P[i][u]; break;}}}flag1=0;g++;}memset(sp,0,sizeof(sp));for(i=0;i<r1;i++){if(P[i][0]==Q[e]){if(P[i][3]==P[i][0]){P[i][3]=P[i][2];P[i][2]=P[i][1];P[i][1]='\'';while(P[i][j]!=0)j++;P[i][j]=P[i][0];P[i][j+1]='\'';sp[i]=1;for(k=0;k<4;k++)P[r1][k]=P[i][k];P[r1][k]='$';sp[r1]=1;}elsej=3;共享知识分享快乐while(P[i][j]!=0)j++;P[i][j]=P[i][0];P[i][j+1]='\''; sp[i]=1;}}}printf(" 消除间接左递归后的文法为:\n"); for(t=0;t<=r1;t++){if(sp[t]==1) printf("%s\n",P[t]);}}void perm(char str[N][N], int i, int n){int k=0,j=0;char temp[N];if(i == n){memset(P , 0, sizeof(P));while(k<count){ strcpy(P[k], str[k]); k++;}while(k<r){ strcpy(P[k], str1[k-count]); k++;}indirectRemove(P);}else{for(j=i;j<=n;j++){ strcpy(temp, str[j]); strcpy(str[j], str[i]); strcpy(str[i], temp); perm(str , i+1, n); strcpy(temp, str[j]);共享知识分享快乐strcpy(str[j], str[i]); strcpy(str[i], temp);}}}输出结果:。

相关文档
最新文档