zoukankan      html  css  js  c++  java
  • 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);
                  }
             }
        }

  • 相关阅读:
    剑指offer55. 平衡二叉树
    剑指offer52. 两个链表的第一个公共节点
    LC1043. Partition Array for Maximum Sum
    剑指offer40. Top K
    剑指offer39. 数组中出现次数超过一半的数字
    剑指offer36.将BST原地转换为双向循环链表
    判断大小端
    CentOS安装RabbitMQ 3.8.9
    Nginx 413 Request Too Large 错误
    NginxPC端和移动端区分
  • 原文地址:https://www.cnblogs.com/nancyzhang/p/8150182.html
Copyright © 2011-2022 走看看