Java使用递归解决算法问题的实例讲解

 更新时间:2016年06月13日 09:00:33   作者:it_wangxiangpan  
递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解,这里我们就来看几个Java使用递归解决算法问题的实例讲解

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

递归的三个条件:
1.边界条件
2.递归前进段
3.递归返回段

当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

下面通过两个示例程序来说明:
1.使用Java代码求5的阶乘。(5的阶乘=5*4*3*2*1)

package org.wxp.recursion; 
/** 
 * 计算5的阶乘(result = 5*4*3*2*1) 
 * @author Champion.Wong 
 */ 
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)

2.使用Java代码求数列:1,1,2,3,5,8......第40位的数

package org.wxp.recursion;  
/** 
 * 求数列:1,1,2,3,5,8......第40位的数 
 */ 
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.问题描述:求解Fibonacci数列的第10个位置的值? (斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*))
程序清单:

/** 
 *<p>Title:Java递归算法实例</p> 
 *<p>Description:利用递归算法求解Fibonacci数列第5个数的值</p> 
 *<p>Filename:Fibonacci.java</p> 
 */ 
public class Fibonacci 
{ 
 /** 
 *方法描述:求解Fibonacci数列的递归算法 
 *输入参数:int n 
 *返回类型:int 
 */ 
 public static int fun(int n) 
 { 
  if(1==n || 2==n) 
  { 
  return 1; 
  } 
  else  
  { 
  return (fun(n-1) + fun(n-2)); 
  } 
 } 
  
 /** 
 *方法描述:主方法 
 *输入参数:String[] args 
 *返回类型:void 
 */ 
 public static void main(String[] args) 
 { 
 System.out.println(fun(10)); 
 } 
} 

运行结果如下所示:

复制代码 代码如下:
55

相关文章

  • Java的分片上传功能的实现

    Java的分片上传功能的实现

    本文主要介绍了Java的分片上传功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • SpringBoot结合Redis实现接口幂等性的示例代码

    SpringBoot结合Redis实现接口幂等性的示例代码

    本文主要介绍了SpringBoot结合Redis实现接口幂等性的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • SpringBoot集成Redis—使用RedisRepositories详解

    SpringBoot集成Redis—使用RedisRepositories详解

    这篇文章主要介绍了SpringBoot集成Redis—使用RedisRepositories详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)

    使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)

    这篇文章主要介绍了使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java设计模式之享元模式实例详解

    Java设计模式之享元模式实例详解

    这篇文章主要介绍了Java设计模式之享元模式,结合实例形式详细分析了享元模式的概念、功能、定义及使用方法,需要的朋友可以参考下
    2018-04-04
  • 基于线程池的工作原理与源码解读

    基于线程池的工作原理与源码解读

    下面小编就为大家分享一篇基于线程池的工作原理与源码解读,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • spring中@value注解需要注意的问题

    spring中@value注解需要注意的问题

    本篇文章主要介绍了spring中@value注解需要注意的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 手写java性能测试框架第二版

    手写java性能测试框架第二版

    这篇文章主要为大家介绍了手写java性能测试框架第二版实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • mybatis-plus中的Enum用法实例

    mybatis-plus中的Enum用法实例

    本文主要介绍了mybatis-plus中的Enum用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • java日志门面之JCL和SLF4J详解

    java日志门面之JCL和SLF4J详解

    这篇文章主要给大家介绍了关于java日志门面之JCL和SLF4J的相关资料,在系统开发过程中日志框架的选择与更换是一大挑战,日志门面的概念,如JCL和SLF4J,允许开发者面向接口编程,文中介绍的非常详细,需要的朋友可以参考下
    2024-10-10

最新评论