Java语言基础1--专题课 递归

第1节:方法的执行和返回

/**
*   用于说明简单的函数调用的顺序
*/
public class Demo
{
    public static void main(String[] args)
    {
        a();
    }
    public static void a()
    {
        System.out.println("A");
        b();
        System.out.println("C");
    }
    public static void b()
    {
        System.out.println();
    }
}

Java语言基础1--专题课 递归_第1张图片


第2节:方法执行时的内存分配

/**
*   用于说明方法执行的内存分配问题
*   其中关于只涉及到栈的说明(更多的之后案例中会呈现的)
*/
public class Demo
{
    public static void main(String[] args)
    {
        int i = 1; 
        c();
        System.out.println(i);
    }
    public static void c()
    {
        d();
    }
    public static void d()
    {
        int i = 5;
    }
}

// 最终的输出结果是  1(而不是5)

Java语言基础1--专题课 递归_第2张图片


第3&4节:递归概述

Java语言基础1--专题课 递归_第3张图片


第5&6节:阶乘N!的非递归和递归实现

1)非递归实现

/**
 *  需求:已知   斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2)
 *      斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、...
 *      求出第n个斐波那契数
 *
 *  分析:
 *      1、设F(0)为 a(a=0),设F(1)为b(b=1)
 *      2、递推得到F(2)=b+a;F(3)=(b+a)+b .....
 *      3、总结规律:
 *          n = 0 时 F(0) = a;
 *          n = 1 时 F(1) = b;
 *
 *          当n >=2 时
 *              F(2) =   b  +   a
 *              F(3) = (b+a)    +   a
 *              -------------------------
 *              下一项的等式右面的第一个数 等于上一项的等式右面之和
 *              下一项的等式右面的第二个数 等于上一项的等式右面第一项
 *
 *  编码实现:FibForDemo类--注意  n 为负整数的情况
 *
 */

import java.util.Scanner;

public class FibForDemo
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个非负整数n:");
        long n = sc.nextLong();  // 接收用户的输入

        if(n < 0)
        {
            System.out.println("请输入一个非负整数!");
            return;
        }
        long a = 0;  //  记录 F(0)
        long b = 1;  //  记录 F(1)
        //1、 设置 fib的初始值(不可以使用0、1,因其有特殊意义)   
        long fib = -1;
        //2、判断当前输入是否为0
        if(n == 0)
        {
            fib = a;  // fib为F(0),即为a
        }
        //3、判断当前输入是否为1
        if(n == 1)
        {
            fib = b;  // fib为F(1),即为b
        }
        //4、判断当前输入是否为>=2
        if(n >= 2)
        {
            for(long i = 2; i <= n; i++)
            {
                fib = a + b;    // F(2)=F(0)+F(1) 
                long t = b; // 获取上一项的等式右面的第一项(防止被新值覆盖)
                b = a + b;  // 获取下一项的等式右面的第一项
                a = t;      // 获取下一项的等式右面的第二项
            }
        }
        //4、执行打印
        System.out.println("第 "+n+" 位的斐波那契数为:"+fib);
    }
}

2)递归实现

import java.util.Scanner;
/**
*   需求:根据用户的输入n,求n的阶乘(n!=n*(n-1)*(n-2)*2*1)
*   分析:1、导入Scanner类所在命名空间,实现接受用户的输入
*         2、根据递归使用的必要条件:
*       (1)子问题和原问题做同样的事情:求积
*       (2)边界条件
*               已知:1!=1
*           假设求 5!
*               第一步:5*4!
*                   转化为求4!  第二步:4*3!
*                       转化为求3!  第三步:3*2!
*                           转化为求2!  第三步:2*1!
*                           因为一直1!=1 所以  2!的可以知道,以此类推得到5!的值
*
*       (3)从上述的分析中可知:满足递归使用的必要条件,所以使用递归实现
*       (4)获取递归三要素:
*           -- 边界条件(递推条件):1! =1
*           -- 递归前进段(n != 1):n * (n-1)!
*           -- 递归返回段(n == 1):1
*
*
*         3、实现时,注意异常情况的处理
*
*   编码实现:JieChengRecursionDemo类--递归实现
*/
public class JieChengRecursionDemo
{
    public static void main(String[] args) {
        // 1、定义变量 n 接受用户输入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入正整数n:");
        int n = sc.nextInt();

        // 2、验证用户输入数字的合法性(是否为正整数)
        if (n <= 0) {
            System.out.println("请输入正整数!");
            return;
        }

        // 3、调用函数jC实现
        int jc = jC(n);

        // 4、输出n的阶乘
        System.out.println("n的阶乘是:"+jc);
    }

    // 定义实现阶乘的函数   -- Recursion
    public static int jC(int n)
    {
        if(n == 1)
        {
            return 1;
        }

        return n * jC(n-1);
    }
}

第7&8节:斐波那契的非递归和递归实现

1)非递归实现

/**
*   需求:已知   斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2)
*       斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、...          
*       求出第n个斐波那契数
*   
*   分析:
*       1、设F(0)为 a(a=0),设F(1)为b(b=1) 
*       2、递推得到F(2)=b+a;F(3)=(b+a)+b ..... 
*       3、总结规律:
*           n = 0 时 F(0) = a;
*           n = 1 时 F(1) = b;
*
*           当n >=2 时
*               F(2) =   b  +   a
*               F(3) = (b+a)    +   a
*               -------------------------
*               下一项的等式右面的第一个数 等于上一项的等式右面之和
*               下一项的等式右面的第二个数 等于上一项的等式右面第一项
*
*   编码实现:FibForDemo类--注意  n 为负整数的情况
*
*/

import java.util.Scanner;

public class FibForDemo
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个非负整数n:");
        long n = sc.nextLong();  // 接收用户的输入

        if(n < 0)
        {
            System.out.println("请输入一个非负整数!");
            return;
        }

        long a = 0;  //  记录 F(0)
        long b = 1;  //  记录 F(1)

        //1、 设置 fib的初始值(不可以使用0、1,因其有特殊意义)   
        long fib = -1; 
        //2、判断当前输入是否为0
        if(n == 0)
        {
            fib = a;  // fib为F(0),即为a
        }

        //3、判断当前输入是否为1
        if(n == 1)
        {
            fib = b;  // fib为F(1),即为b
        }

        //4、判断当前输入是否为>=2
        if(n >= 2)
        {
            for(long i = 2; i <= n; i++)
            {
                fib = a + b;    // F(2)=F(0)+F(1) 
                long t = b; // 获取上一项的等式右面的第一项(防止被新值覆盖)
                b = a + b;  // 获取下一项的等式右面的第一项
                a = t;      // 获取下一项的等式右面的第二项
            }
        }
        //5、执行打印
        System.out.println("第 "+n+" 位的斐波那契数为:"+fib);
    }
}

Java语言基础1--专题课 递归_第4张图片


2)递归实现

/**
*   需求:已知   斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2)
*       斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、...          
*       求出第n个斐波那契数
*   
*   分析:分析过程详细见 递归8.png图片
*       
*   编码实现:FibRecursionDemo类--注意  n 为负整数的情况
*   
*       函数实现fib的第n项
*/

import java.util.Scanner;

public class FibRecursionDemo
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个非负整数n:");
        long n = sc.nextLong();  // 接收用户的输入

        if(n < 0)
        {
            System.out.println("请输入一个非负整数!");
            return;
        }

        // 函数调用实现fib求解
        long fib = fib(n);

        // 执行打印
        System.out.println("第 "+n+" 位的斐波那契数为:"+fib);
    }

    // 接受用户输入的非负整数n求解斐波那契数
    // 当数字n为负整数时,在main方法中进行异常处理
    //   主要是为了让方法专注于特定功能的实现
    public static long fib(long n)
    {
        // 当 n 为 0、1 时,直接返回
        if(n == 0 )
        {
            // 递归返回段1
            return 0;   
        }
        if(n == 1 )
        {
            // 递归返回段2
            return 1;
        }

        /* 边界条件(递推条件)  n >= 2
           当 n >= 2 时,进行递归处理
           递归前进段  
        */
        return fib(n - 1) + fib(n - 2);
    }
}

Java语言基础1--专题课 递归_第5张图片


你可能感兴趣的:(自学Java)