「递归下降java」递归下降法必须先消除

博主:adminadmin 2023-01-26 01:00:08 314

今天给各位分享递归下降java的知识,其中也会对递归下降法必须先消除进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java精髓在哪里?

Java应用于某些有趣、实用的计算机问题和编程任务中,全面展示了Java语言的强大功能、敏捷性、多样性和艺术性。本书各章内容分别涉及到Java精髓、递归下降的表达式解析器、用Java实现语言解释器、用Java创建下载管理器、用Java实现E-mail客户端和Internet搜索、用Java修饰HTML、显示统计图表、金融应用中的Applet和Servlet、基于AI的问题求解等,每章给出的示例代码都可以直接运行,无需修改. 如今,Java库已经基于最初的核心库得到了极大发展。Java的每个新版本都会提供一些新的库。新的程序包不断增加,新的功能也不断加入已有的程序包中。Java库的发展过程处于一个连续的状态,因为Java必须能够适应快速演变的计算环境。这种在短期内适应和变化的能力也是Java的精髓之一。

谁能帮我写个下面文法的递归下降程序,用java实现,java作业中的一个问题,急啊,明天就要交了,求高手们

import java.util.Scanner;

public class LL1 {

private static String str;

private static int ptr,len,step;

private static boolean right;

public static boolean Advance() {

if (ptr len - 1) {

ptr++;

pri("");

return true;

} else {

return false;

}

}

public static void pri(String s) {//输出推导过程

step++;

System.out.println(step + "\t" + str.charAt(ptr) + "\t" + s + "\t"

+ str.substring(ptr));

}

public static void E() {

pri("E-TG");

T();

G();

}

public static void G() {

if (str.charAt(ptr) == '+') {

pri("G-+TG");

if (!Advance()) {

return;

}

T();

G();

} else if (str.charAt(ptr) == '-') {

pri("G--TG");

if (!Advance()) {

return;

}

T();

G();

} else {

pri("G-ε");

}

}

public static void T() {

pri("T-FS");

F();

S();

}

public static void S() {

if (str.charAt(ptr) == '*') {

pri("S-*FS");

if (!Advance()) {

return;

}

F();

S();

} else if (str.charAt(ptr) == '/') {

pri("S-/FS");

if (!Advance()) {

return;

}

F();

S();

} else {

pri("S-ε");

}

}

public static void F() {

if (str.charAt(ptr) == '(') {

pri("F-(E)");

if (!Advance()) {

return;

}

E();

if (str.charAt(ptr) == ')') {

if (!Advance()) {

return;

}

} else {

Error();

}

} else if (str.charAt(ptr) == 'i') {

pri("F-i");

if (!Advance()) {

return;

}

} else {

Error();

}

}

public static void Error() {

right = false;

pri("Error!");

if (!Advance()) {

return;

}

}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

str = new String(sc.next());

ptr = step = 0;

right = true;

len = str.length();

System.out.println("步骤\t当前\t产生式\t输入串");

E();

if (right ptr == len - 1) {

System.out.println(str + " is leagal!");

} else {

System.out.println(str + " is illeagal!");

}

}

}

过程差不多,仅供参考

构造如下文法的递归下降分析程序 exp→+ num exp | - num exp | ε

文法递归,从实现上,主要进行两个步骤:

1 词法分析后,建立语法单元。

2 将语法单元根据操作符建立语法树,并对语法进行正确性校验。

如果不是要求一定要全部自己写,完全可以依赖词法和语法分析工具。

例如:

1 老牌的有yacc/lex,新版本bison/flex。

2 新的有java的javacc,跨语言的ANTLR。

这些都是写好符合自己规则的文法解析规则,自动生成解析程序。然后自己加入文法执行逻辑。

如果不是学习,不建议自己写文法分析程序。如果是学习,主要的工作还是在语法树的建立上。

为什么说递归效率低?

对于递归,有人提到了两点:

(1)对栈的容量的压力。

(2)个别问题的递归解法,其算法的低效性。

这两个因素我简短点评下,

(1)对栈的容量压力:

通常递归的深度很大造成的。对于这一点当然应该有程序员编码时,来衡量和把握。win32 中一个新建的线程,默认的栈通常在 1 MB 大小。那么如果你的递归函数,深度很大,显然程序员应该对这种情况有预估,和对风险的避免。

这就和你选择,把内存分配在栈上还是堆上,会考虑到分配的内存大小的因素一样。

当然,如果在函数内分配很大的栈上空间,在函数体内定义一个很大的数组,这样不需要很深的深度,也会让栈溢出。这当然也是程序员自己应该控制的。

(2)个别问题的递归解法,算法的低效。

这个低效主要在于这个问题的算法本身。而不是在递归这种方法上。比如说求斐波那契的某一项,子问题会大量重复出现,会产生很多重复计算,这个是很多算法书上,是用来引导出动态规划或者查表法的。

这主要是算法本身的效率问题,而不是递归的问题。这一点是必须应该明确的。

(3)我们可以看到,在和树有关的算法中,经常会有递归函数。

例如,遍历文件夹,删除注册表的某一个 key (及其所有子key)。

尤其对一般树的前序,后序遍历,二叉树的中序遍历。

这主要原因是因为树的定义,就是“递归性”的:

树就是,某一个节点有多个子节点,每个子节点是一个树。

我们再此可以看到,递归的显著优点,是对解的描述的直观性,代码的简洁性。

关于递归下降java和递归下降法必须先消除的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。