Java中的递归原理分析

解释:程序调用自身的 编程 技巧叫做递归。
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
 
递归的三个条件:
边界条件
递归前进段
递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
 
下面通过两个示例程序来说明:
使用 Java代码求5的阶乘。(5的阶乘=5*4*3*2*1)
 
[java]  
package org.wxp.recursion;  
  
/** 
 * 计算5的阶乘(result = 5*4*3*2*1) 
 * @author Mr.Gao 
 *  
 * 
 */  
public class Test01 {  
    public static void main(String[] args) {  
        System.out.println(f(5));  
    }  
      
    public static int f(int n) {  
        if (1 == n)   
            return 1;  
        else   
            return n*f(n-1);  
    }  
}  
 
 
此题中,按照递归的三个条件来分析:
(1)边界条件:阶乘,乘到最后一个数,即1的时候,返回1,程序执行到底;
(2)递归前进段:当前的参数不等于1的时候,继续调用自身;
(3)递归返回段:从最大的数开始乘,如果当前参数是5,那么就是5*4,即5*(5-1),即n*(n-1)
 
使用Java代码求数列:1,1,2,3,5,8......第40位的数
[java]  
package org.wxp.recursion;  
  
/** 
 * 求数列:1,1,2,3,5,8......第40位的数 
 * @author Mr.Gao
 *  
 */  
public class Test_02_Fibonacci {  
    public static void main(String[] args) {  
        System.out.println(f(6));  
    }  
      
    public static int f(int n ) {  
        if (1== n || 2 == n)   
            return 1;  
        else  
            return f(n-1) + f(n-2);  
    }  
}  
 
 
此题的突破口在:从第3位数开始,本位数是前两位数的和。要计算第多少位的值,那么就需要将位数作为参数传进方法进行计算。
(1)首先,当位数为1和2时,当前返回的值应该是1;
(2)然后,当位数为3时,返回值应该=2=1+1;
                 当位数为4时,返回值=3=2+1;
                 当位数为5时,返回值=5=3+2;
                 当位数为6时,返回值=8=5+3;
                 ......
(3)由(2)得知,大于等于3的情况下,当前位数(n)的数值=f(n-1)+f(n-2)
 

心得:有些初学者可能认为递归即是自己调用自己,那岂不是死循环了。对,如果递归写的不合理,那就是死循环了。但是如果写的合理,加上“边界条件”,程序执行到底的时候,会逐层返回。就像我们爬山一样,我们绕着山路爬上一层又一层,如果没有山顶,我们会一直往上爬。但如果到了山顶,就按照上山时候的步骤一层一层的往下爬。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 编译原理语法分析是编译器的关键步骤之一,用于检查源码是否符合文法规则,判断语义是否正确,生成间代码等等。其递归下降分析法是常用的语法分析方法之一。具体说,递归下降分析法从语法的开始符号开始,通过递归调用函数来实现对语法规则的分析。在解析过程,程序使用递归下降算法按照语法的层次进行分解,将复杂的问题分解为简单的子问题,每个子问题对应一个子程序,依次调用子程序就可以完成对整个文法的语法分析。 在Java编译器的实现javac采用了递归下降分析法。Java语言的语法规则十分复杂,包括各种语句、表达式、变量类型等等,因此编写一个符合Java语法的递归下降分析程序也非常复杂。总的来说,javac的语法分析程序包括以下几个部分:词法分析器、语法分析器、符号表等。 词法分析器用于将源程序转化为词法单元(Token),然后传给语法分析器进行分析。语法分析器则根据Java语法规则,利用递归下降分析法来对Token序列进行分析,采用自顶向下的分析方法,逐步分析语法规则,直到最终将整个程序解析完成。在语法分析过程,还需要使用符号表来确定变量类型,计算表达式的值等等,完成语义分析的任务。 总的来说,递归下降分析法是一种常用的语法分析方法,适用于多种编程语言的编译器实现,可以通过编译原理的学习和练习,更好地掌握这一方法,并开发出高质量的编译器。 ### 回答2: 编译原理语法分析是指将源程序转换为一种内部表示形式的过程,在此过程,需要对源程序进行语法分析,也就是检查源程序是否符合语法规则。递归下降分析是一种常用的语法分析方法,它是基于自顶向下的语法推导方法实现的。 在进行递归下降分析时,我们需要将源程序按照相应的语法规则进行分解,然后递归分析每个生成式对应的子串,最终得到源程序的语法树。递归下降分析的一个优点是它能够直接产生语法树,因此更容易进行语义分析和代码生成等后续处理。 在Java编译器的实现javac使用了递归下降分析方法对源代码进行语法分析。在分析过程,它将Java源代码分解为若干个符号,然后按照Java语法规则进行递归下降分析,最终得到语法树。与其他编译器相比,javac的递归下降分析方法具有较高的可读性和可维护性,因为它的代码与Java语法规则紧密相关。 同时,在语法分析的过程javac还涉及到词法分析、语法错误处理、符号表管理等方面的问题,这些都是编译原理的基础知识点,对于Java编译器的实现非常重要。 ### 回答3: 编译原理语法分析是编译器的一个重要组成部分,其作用是对程序源代码进行语法分析,将其转换为可以执行的目标代码。其递归下降分析法是一种常用的语法分析方法。 在递归下降分析,编译器会根据语法规则对源代码进行递归分析,以确定其语法正确性,并生成对应的语法树。该方法的基本思路是把一个复合语法规则拆分成多个较简单的子规则,然后通过递归调用不同的子规则来完成分析过程。这种方法可以较为高效地进行语法分析,但需要编写大量的递归函数来完成分析工作。 对于Java编译器而言,语法分析是其一个非常重要的部分,因为Java有严格的语法规则需要遵循。在语法分析Java编译器可以使用递归下降分析法进行处理,通过遍历源代码来分析的语法结构,生成对应的语法树,最终将其转化为可执行的目标代码。同时,在使用递归下降分析法时,Java编译器需要对不同的语法规则进行拆分和分析,并通过栈的方式来完成函数递归调用,以实现整个语法分析过程。 总之,递归下降分析法是编译原理语法分析的一个重要方法,可以用于解析各种编程语言的语法结构。在Java编译器递归下降分析法也是其一个重要的语法分析方法,在语法分析过程起着关键性的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值