当前位置: 首页 > 编程笔记 >

Java中递归原理实例分析

姚淳
2023-03-14
本文向大家介绍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程序设计有所帮助。

 类似资料:
  • 本文向大家介绍C++ 中二分查找递归非递归实现并分析,包括了C++ 中二分查找递归非递归实现并分析的使用技巧和注意事项,需要的朋友参考一下 C++ 中二分查找递归非递归实现并分析 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高。因此较为受我们追捧。其实二分查找算法,是一个很经典的算法。但是呢,又容易写错。因为总是考虑不全边界问题。 用非递归简单分析一下,在编写过程中,如果编写的是以下的代

  • 问题内容: 我得到以下代码: 我可以理解诸如阶乘和斐波那契这样的递归,但是对于这一点我不能理解。我试图追踪逻辑: 我总是以其他任何数字结尾7,我知道这是错误的,因为在运行程序时会得到不同的值。您能帮我了解递归在这里如何工作吗? 问题答案: 我认为这是不言自明的,如果您需要更多信息,请评论!

  • 本文向大家介绍C语言的递归思想实例分析,包括了C语言的递归思想实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析C语言的递归思想,分享给大家供大家参考之用。具体方法如下: 通俗点来说,递归就是自己调用自己。 递归的难点一是理解递归的执行调用过程,二是设置一个合理的递归结束条件。 下面来看一段摘自书中的简单程序: 该程序用来计算阶乘,分别采用循环和递归实现。用语言来描述一下递归的执行过程

  • 本文向大家介绍java乐观锁原理与实现案例分析,包括了java乐观锁原理与实现案例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java乐观锁原理与实现。分享给大家供大家参考,具体如下: 简单说说乐观锁。乐观锁是相对于悲观锁而言。悲观锁认为,这个线程,发生并发的可能性极大,线程冲突几率大,比较悲观。一般用synchronized实现,保证每次操作数据不会冲突。乐观锁认为,线程冲突可能

  • 我正在处理一个递归二分法/算法。我已经把我的递归放在else/else if语句中,不知道我是否错了。它也返回正确的根,而没有递归,但主要问题是用递归。

  • 本文向大家介绍java递归算法的实例详解,包括了java递归算法的实例详解的使用技巧和注意事项,需要的朋友参考一下 递归三要素: 1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题规模。 1、1+2+3+…+n 2、1 * 2 * 3 * … * n 3、斐波那契数列 前两项均为1,第三项开始,每一项都等于前两项之和。即:1,1,2,3,5,8,… 4、二叉树的遍