Java中递归原理实例分析_java

本文实例分析了Java中递归原理。分享给大家供大家参考。具体分析如下:

解释:程序调用自身的编程技巧叫做递归。

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
 
递归的三个条件:

       边界条件
       递归前进段
       递归返回段
       当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
 
下面通过两个示例程序来说明:

使用java代码求5的阶乘。(5的阶乘=5*4*3*2*1)

/**
 * 计算5的阶乘(result = 5*4*3*2*1)
 * @author pplsunny
 *
 *
 */
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*(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位的数

/**
 * 求数列:1,1,2,3,5,8......第40位的数
 * @author pplsunny
 *
 */
public class Test_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)

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

希望本文所述对大家的java程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
递归原理
java递归算法经典实例、java递归调用实例、java递归实例、java递归原理、java递归算法原理,以便于您获取更多的相关知识。

时间: 2024-12-30 07:09:35

Java中递归原理实例分析_java的相关文章

python中self原理实例分析

  本文实例讲述了python中self原理.分享给大家供大家参考.具体分析如下: 类的方法与普通的函数只有一个特别的区别--它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值.这个特别的变量指对象本身,按照惯例它的名称是self. 假如你有一个类称为MyClass和这个类的一个实例MyObject.当你调用这个对象的方法 MyObject.method(arg1, arg2) 的时候,这会由Python自动转为 MyClass.method

java中transient关键字用法分析_java

本文实例分析了java中transient关键字用法.分享给大家供大家参考.具体分析如下: java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身.这可以极大地方便网络上的一些操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的东西都能存储(因为那样,别人可以通过序列化知道类里面的内容),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后

Java接口和抽象类实例分析_java

本文实例讲述了Java的接口和抽象类.分享给大家供大家参考.具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类. 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实

基于java中反射的总结分析_java

刚开始学习java的时候真的很难理解反射到底是个什么东西 一些书籍,哪怕是很经典的书籍都解释的让人感觉懵懵的,或许的确是我太笨 况且,网上说在将来学习框架的时候需要经常应用到反射机制,这样一来总让人心里有些不安 就方才偶然又把讲解反射的章节和视频看了一点,觉得能理解一些了 现在决定一鼓作气,边看边写,顺便把一些主要的内容和操作都记载到这里 我想,对于我这么一个笨笨的人来说,学习的最好方法也许就是不断重复 遇到不懂的知识就停下来把以往的重新学一遍,虽然浪费了很多时间,但对我也有些效果   我的理解

解析java中super的用法分析_java

昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为大家更好的认识提供一点思路.1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量:2)在一个构造函数中调用另外一个构造函数的时候应该用的是同一块内存空间,在默认的构造函数中先初始化变量,调用另一个的时候覆写已经初始化的变量的值:3)整个调用的过程和递归调用函数有点类似,不断充气球,直

Java中的观察者模式实例讲解_java

观察者模式是一种行为设计模式.观察者模式的用途是,当你对一个对象的状态感兴趣,希望在它每次发生变化时获得通知.在观察者模式中,观察另外一个对象状态的对象叫做Observer观察者,被观察的对象叫着Subject被观察者.根据GoF规则,观察者模式的意图是: 复制代码 代码如下: 定义对象之间一对多的依赖关系,一个对象状态改变,其他相关联的对象就会得到通知并被自动更新. Subject(被观察者)包含了一些需要在其状态改变时通知的观察者.因此,他应该提供给观察者可以register(注册)自己和u

java实现屏幕共享功能实例分析_java

本文实例讲述了java实现屏幕共享功能的方法.分享给大家供大家参考.具体分析如下: 最近在做软件软件工程的课程设计,做一个用于实验室的屏幕监控系统,参考各种前人代码,最后领悟之后要转换自己的代码,初学者都是这样模仿过来的. 说到屏幕监控系统,有教师端和学生端,教师端就是Server端,学生端就做Client端.系统里比较有趣的一个地方应该算是屏幕广播与屏幕监控吧,其余什么点名签到,锁屏,定时关机的,就相对来说简单点. 屏幕广播,在功能实现上面,说白了,就是教师端的机器不断截取屏幕信息,以图片的形

java动态方法调度实例分析_java

本文实例讲述了java动态方法调度.分享给大家供大家参考,具体如下: 动态方法调度: 1. 访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定. 2. 访问一个引用型的变量的静态方法,运行时与声明的类的方法绑定. 3. 访问一个引用型的变量的成员变量(包括静态变量和实例变量),运行时与声明的类的成员变量绑定. 第3点尤其注意啊,之前我从来没注意过啊 1. 非静态方法: public class Person { public String name; public void ge

基于java中泛型的总结分析_java

要我直接说出泛型是个what我还真讲不出来,这里先由一道问题引入: 定义一个坐标点类,要求能保存各种类型的数据,如:整形,浮点型,和字符串类型 既然变量类型起先不确定,那么很容易想到就是用所有类型的父类,也就是Object类来代替 不废话了,用代码来体现 实例1:用Object来实现不确定的数据类型输入 复制代码 代码如下: //这是定义的坐标点类class Point {    private Object x;    private Object y;     //用Object来表示不确定