Java学习 8.Java-递归

简介: Java学习 8.Java-递归

一、递归的概念

引例:

一个方法在执行过程中调用自身,就称为递归(函数自己调用自己)

递归相当于数学的数学归纳法,有一个起始条件,有一个递推公式

递归的必要条件

1.将原问题划分为子问题,注意:子问题必须要与原问题解法相同。

2.递归出口(自己调用自己,且有一个结束条件) 分为递、归两个问题

引例

    public static void fun(int a){
        if(a==1){
            return;
        }
        System.out.println(a);
        fun(a-1);
    }
    public static void main0(String[] args) {
        fun(3);
    }

运行结果

二、递归联系习题

1.递归求N的阶乘

思路

传入n的值,当n=1时候,阶乘为1,当n不为1的时候,递归调用方法乘以n-1;

代码实现

    //1.递归求 N 的阶乘
    public static int Fac(int n){
        if(n==1){
            return 1;
        }else{
            int t=n*Fac(n-1);
            return t;
        }
    }
    public static void main(String[] args) {
        int n=0;
        System.out.println("请您输入想要求阶乘的数字");
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        int sum=Fac(n);
        System.out.println("递归的结果阶乘为"+sum);
    }

运行结果

2.输入一个整数,求每位组成数字之和,递归实现

思路

输入一个整数,传递参数,首先递归计算到最前的一位,并将其保留,然后进行归并打印

递的过程:准备工作

归的过程:整理与完善工作

代码实现

    //2.输入一个整数,求每位组成数字之和,递归实现
    public static void print(int n)
    {
        //结束条件
        if(n<10){
            System.out.print(n);
            System.out.print(" ");
            return;
        }else {
        //递归条件
            print(n / 10);
            System.out.print(n % 10);
            System.out.print(" ");
        }
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请您输入一个整数");
        int n=sc.nextInt();
        print(n);
    }

运行结果

3.递归返回组成数字之和

思路

对传递的数字进行取余和除以10的操作,传递给一个求值总数的数字,将求值的数字传递回来,得出结果

代码实现

    public static int num(int n){
        if(n<10){
         return n;
        }
        int tmp=n%10+num(n/10);
        return tmp;
    }
    public static void main(String[] args) {
        System.out.println("请您输入你想要计算的数字");
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int sum=num(n);
        System.out.println(sum);
    }

运行结果

4.求斐波那契数列的前n项

4.1递归实现

思路

传入参数,当参数为1/2时,斐波那契数列传递为1,当参数大于2时,斐波那契数列返回前一项和前两项的数字之和,最终得出第n项斐波那契数列的值

代码实现

    //4.递归求斐波那契数列的第 N 项
    public static int Fib(int n){
        if(n==1||n==2){
            return 1;
        }else{
            return Fib(n-1)+Fib(n-2);
        }
    }
    public static void main(String[] args) {
        System.out.println("请您输入你想要计算的数字");
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println(Fib(n));
        System.out.println(Fib(5));
    }

运行结果

能不使用递归的方式,最后用循环的方式实现斐波那契数列问题,避免出现冗余运算

4.2 循环实现

代码实现

 //5.循环求解斐波那契数列问题,求斐波那契数列的第 N 项
    public static int fib(int n){
        int last1=1;
        int last2=1;
        int cur=0;
        for(int i=3;i<=n;i++){
            cur = last1+last2;
            last2=last1;
            last1=cur;
        }
        return cur;
    }
    public static void main(String[] args) {
        System.out.println("请您输入你想要计算的数字");
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int cur=fib(n);
        System.out.println(cur);
    }

运行结果

5.汉诺塔问题

* 传入n个盘子,编号从1..n,我就能按照汉诺塔的规则,从目标盘子A -> C ,B是辅助盘

A 起始柱子

B 辅助柱子

C 目标柱子

代码实现

    //5.递归求解汉诺塔问题
    /*
    @param n
    @param pos1 起始位置
    @param pos2 中转位置
    @param pos3 目标位置
     */
      public static void hanoi(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);
      }
      public static void move(char pos1,char pos2){
          System.out.print(pos1+"->"+pos2+" ");
      }
    public static void main(String[] args) {
        System.out.println("请输入你想求解的数字");
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        hanoi(n,'A','B','C');
    }

运行结果


目录
相关文章
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
98 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
41 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
59 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
37 2
|
2月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
43 1
|
2月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
31 1
|
2月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
39 0
|
2月前
|
Java 大数据 开发工具
java学习——环境准备(1)
java学习——环境准备(1)
43 0