Java基础------递归(Java实现)

问题描述: 简单说明什么是递归?什么情况会使用?并使用Java实现一个简单的递归程序?

1. 什么是递归?

 递归(recursion)作为一种算法在程序设计语言中广泛应用,是指函数在运行过程中直接或间接调用自身而产生的重入现象。

 来自百度百科的解释:

  递归做为一种算法程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

2. 构成递归需具备的条件?

  (1) 子问题须与原始问题为同样的事,且更为简单;

  (2) 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

3. 递归的应用!!!

 递归算法一般用来解决三类问题:

  (1) 数据的定义是按递归定义的。

    比如:Fibonacci(斐波那契)函数,F[n]=F[n-1]+F[n-2]   (其中n>1,F[0]=0,F[1]=1)

  (2) 问题解法按递归算法实现。

    这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

  (3) 数据的结构形式是按递归定义的。

    如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。

4. 递归的缺点

  递归算法解题相对常用的算法如普通循环等,运行效率较低。

  因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。

   因为在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

5. 如何设计递归算法?

  (1) 确定递归公式

  (2) 确定边界(结束)条件

  

6. 递归的应用举例

  (1) 计算n! (n的阶乘factorial)的算法

    public class Factorial {
            public static void main(String[] args) {
            System.out.println("请输入一个大于等于0的整数");
            Scanner scan=new Scanner(System.in);
            int n=scan.nextInt();
            
            if(n<0){
                  System.out.println("输入数值非法");
            }else{
                  int result=doFactorial(n);
                  System.out.println(n +"的阶乘为:" + result);
            }     
       }
        //有效代码
        public static int doFactorial(int n){
            if(n==0 || n==1){
                return 1;
            }else{
                return n*doFactorial(n-1);
            }
        }
   }

  (2) 斐波那契函数的实现

    public class Fibonacci {
        public static void main(String[] args) {
              System.out.println("请输入一个正整数:");
              Scanner scan=new Scanner(System.in);
              int n=scan.nextInt();
        
              if(n<0){
                    System.out.println("输入数值非法!");
              }else{
                    int result=doFibonacii(n);
                    System.out.println(n+"的斐波那契值为:" + result);
              }
        }
    
        public static int doFibonacii(int n){
              if(n==0 || n==1){
                  return n;
              }else{
                  return doFibonacii(n-1)+doFibonacii(n-2);
              }
         }
    }

原文地址:https://www.cnblogs.com/nancyzhang/p/8150182.html

时间: 2024-10-09 06:01:15

Java基础------递归(Java实现)的相关文章

【java基础】Java反射机制

一.预先需要掌握的知识(java虚拟机)  1)java虚拟机的方法区:  java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区.方法区的主要作用是存储被装载的类 的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class 中的类型信息,将这些信息存储到方法区中.这些信息主要包括: 这个类型的全限定名 这个类型的直接超类的全限定名 这个类型是类类型还是接口类型

【Java基础】Java面试题目整理与解说(二)

1.Collection 和 Collections 的差别. Collection 是集合类的上级接口,继承于他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 2.HashMap 和 Hashtable 的差别. HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完毕了 Map 接口,HashMap是非线程安全,效率上可能高于 Hashtable.在多个线程

Java基础 之Java动态绑定详解

程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定(早绑定 编译器绑定): 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C. 针对java简单的可以理解为程序编译期的绑定:这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定(迟绑定 运行期绑定): 后期绑定:在运行时根据具体对象的类型进行绑定. 若一种语言实现

【Java基础】Java面试题目整理与讲解(二)

1.Collection 和 Collections 的区别. Collection 是集合类的上级接口,继承于他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 2.HashMap 和 Hashtable 的区别. HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,HashMap是非线程安全,效率上可能高于 Hashtable.在多个线程

java基础---------递归和循环的使用效率

package java基础; /** * 参数递归和迭代的效率,递归效率太低,如果用到递归一般使用循环 */ public class TestRecursion { public static void main(String[] args) { //标记递归方法开始执行事件 long d1=System.currentTimeMillis(); System.out.printf("%d阶乘结果:%s%n",10,factorial(10)); //递归程序结束时间 long d

黑马程序员——Java基础---递归

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流!                                                                       递归 Java支持递归. 递归是根据自身定义内容的过程.就java编程而言,递归是一个允许方法调用自身的特征. 调

JAVA基础知识-java文化基础和运行环境

JAVA基础知识 1,java是95年sun公司推出的开发语言,发展很快,09年被oracle公司收购.至今分为SE.ME.EE三个发展方向和软件版本. 2,运行java的环境主要是通过JVM(java virtual machine)实现的.首先编写.java结尾的源文件,通过编译器编译成.class结尾的字节码文件,然后通过解释器实现在不同平台上一致运行的效果. 3,jvm,jre和jdk的区别:jvm,java虚拟机:jre,java运行环境,jdk:java开发工具包. 4,jdk的下载

java基础&lt;day01&gt; java介绍,安装jdk,配置环境变量

1.java基础:sun公司,史坦福大学,1995年2.java语言是一个完全面向对象安全可靠与平台无关的编程语言.(c++语言是微软的语言,之所以windows支持c++,是因为,微软在windows系统里装有虚拟机,windows系统就是c和c++语言写的)3.java语言三种技术架构:J2EE(企业级,也是程序员使用),J2SE(基础版本,标准版),J2ME(嵌入式设备,如手机中的应用程序)4.更新后叫做:JAVAEE JAVASE JAVAME(我们是javaee程序员).5.java语

Java基础之——Java概述与基础知识

1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路.方法.和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务. 这种人和计算机之间交流的过程就是编程. 2.Java语言概述,历史.特点 是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级语言. 是一种面向Internet

【Java基础】Java中的语法糖

目录 Java中的语法糖 switch对String和枚举类的支持 对泛型的支持 包装类型的自动装箱和拆箱 变长方法参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with-resource Lambda表达式 Lambda表达式的语法 基本的Lambda例子(实现功能接口) 使用Lambdas排序集合 使用Lambdas和Streams 字符串对+号的支持 参考 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身