「递归下降java」递归下降法必须先消除
今天给各位分享递归下降java的知识,其中也会对递归下降法必须先消除进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、Java精髓在哪里?
- 2、谁能帮我写个下面文法的递归下降程序,用java实现,java作业中的一个问题,急啊,明天就要交了,求高手们
- 3、构造如下文法的递归下降分析程序 exp→+ num exp | - num exp | ε
- 4、为什么说递归效率低?
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和递归下降法必须先消除的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。