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');
    }

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/123385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用数据分析,识别设备异常

设备健康监测系统在工业领域中扮演着至关重要的角色&#xff0c;它能够帮助企业及时发现设备异常&#xff0c;预防故障&#xff0c;提高设备使用寿命和生产效率。而异常诊断技术则是设备健康监测系统中的核心部分&#xff0c;能够实现对设备异常情况的准确判断。根据设备状态数…

AI:69-基于深度学习的音乐推荐

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

命令行远程操作windows

如遇安装python模块问题&#xff0c;请参考此连接处理&#xff1a;http://t.csdnimg.cn/l9W6f 一、命令行中使用ssh连接 1、安装 OpenSSH 客户端&#xff1a; 在 Windows 10 中&#xff0c;打开“设置”应用&#xff0c;选择“应用” > “可选功能” > “添加功能”。…

python- os模块

一、文件与目录相关的操作 1、删除文件/文件夹 2、os.stat("path/filename"): 获取文件/目录信息的结构说明 3、os.listdir 和 os.path.join 在Python中&#xff0c;os.listdir()和os.path.join()是操作系统模块&#xff08;os模块&#xff09;的两个函数&#x…

机器学习——奇异值分解案例(图片压缩未开始)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼&#xff0c;头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作&#xff0c;会有一种浮在云端的虚无感 但是如果要实际操作&#xff0c;我又不想直接调用库包 可是…如果不直接调包&#xff0c;感…

Python Opencv实践 - 车牌定位(纯练手,存在失败场景,可以继续优化)

使用传统的计算机视觉方法定位图像中的车牌&#xff0c;参考了部分网上的文章&#xff0c;实际定位效果对于我目前使用的网上的图片来说还可以。实测发现对于车身本身是蓝色、或是车牌本身上方有明显边缘的情况这类图片定位效果较差。纯练手项目&#xff0c;仅供参考。代码中im…

学之思开源考试系统部署至Centos7

学之思开源考试系统部署至Centos7 1、下载源码 源码下载&#xff1a; https://gitee.com/mindskip/xzs-mysql 数据库脚本下载&#xff1a; https://www.mindskip.net:999/ 2、项目打包 分别在\source\vue\xzs-student目录和source\vue\xzs-admin目录&#xff0c;执行前端打…

【遮天】叶凡首次高燃时刻,暴打姜峰逼其下跪,故事逐渐燃情

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《遮天》国漫30集剧情最新内容解析&#xff0c;前面剧情中&#xff0c;叶凡被姜峰如疯狗一般追杀&#xff0c;他像一只被狼群追逐的鹿&#xff0c;在山林中亡命逃窜。身后是姜峰那歇斯底…

KaiOS APN配置文件apn.json调试验证方法(无需项目全编)

1、KaiOS 的应用就类似web应用&#xff0c;结合文件夹路径webapp字面意思理解。 2、KaiOS APN配置文件源代码在apn.json&#xff0c; &#xff08;1&#xff09;apn.json可以自定义路径&#xff0c;通过配置脚本实现拷贝APN在编译时动态选择路径在机器中生效。 &#xff08;…

Ubuntu22.04安装MySql

在Ubuntu上安装mysql就比较简单了 1、常规操作&#xff0c;更新软件包列表 apt update 至少安装之前看一眼版本吧 apt list mysql-server 嗯&#xff0c;是8.0.35版本的 2、安装mysql apt install mysql-server 3、给root用户设置密码 # 第一次安装完无需密码,让你输入…

【C语言】嵌套结构体初始化 - 一个有趣的结论

0. 前言 A. 嵌套结构体&#xff08;比如双链表&#xff09;的初始化一般是什么流程&#xff1f; B. 嵌套结构体的内存是如何分布的&#xff1f; C. 结构体中的结构体指针是否需要再次分配内存&#xff1f;不分配会怎么样&#xff1f; 关于嵌套结构体的初始化问题&#xff0c;我…

华为H12-831题库

单选&#xff09;当IS-IS网络中有多条冗余链路时&#xff0c;可能会出现多条等价路由。关于IS-IS网络内的等价路由&#xff0c;以下哪个描述是错误的? A、当组网中存在的等价路由数量大于通过命令配置的数量&#xff0c;且这些路由优先级相同时&#xff0c;优选下一跳设备Sys…

基于springboot 停车场管理系统-计算机毕设 附源码 39315

spring boot停车场管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。…

外包干了2个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Linux - 进程程序替换 - C/C++ 如何实现与各个语言之间的相互调用 - 替换环境变量

前言 我们之前利用 fork&#xff08;&#xff09;函数来创建子进程&#xff0c;这种方式是 父子进程 共用一个代码&#xff0c;只是在代码当中使用了 if-else 语句来分流&#xff0c;达到父子进程运行不同的代码块的目的。但是其实本质上&#xff0c;还是父子共用一个代码和数…

前端-第一部分-HTML

一.初识HTML 1.1 HTML 简介 HTML 全称为 HyperText Mark-up Language&#xff0c;翻译为超文本标签语言&#xff0c;标签也称作标记或者元素。HTML 是目前网络上应用最为广泛的技术之一&#xff0c;也是构成网页文档的主要基石之一。HTML文本是由 HTML 标签组成的描述性文本&a…

spring 中 @Validated/@Valid

超级好的链接 添加链接描述

Linux 下最主流的文件系统格式——ext

硬盘分成相同大小的单元&#xff0c;我们称为块&#xff08;Block&#xff09;。一块的大小是扇区大小的整数倍&#xff0c;默认是 4K。在格式化的时候&#xff0c;这个值是可以设定的。 一大块硬盘被分成了一个个小的块&#xff0c;用来存放文件的数据部分。这样一来&#xf…

01-PostgreSQL安装与远程连接

一、windows安装PostgreSQL ①&#xff1a;下载 1. 官网下载 地址&#xff1a;https://www.postgresql.org/download/ 选择对应系统 点击下载 选择下载的版本&#xff08;我这里下载14.X版本&#xff09; 下载完成 2. 网盘下载 链接&#xff1a;https://pan.baidu.com/s/1u3Z…

深入解析 Redis 分布式锁原理

一、实现原理 1.1 基本原理 JDK 原生的锁可以让不同线程之间以互斥的方式来访问共享资源&#xff0c;但如果想要在不同进程之间以互斥的方式来访问共享资源&#xff0c;JDK 原生的锁就无能为力了。此时可以使用 Redis 来实现分布式锁。 Redis 实现分布式锁的核心命令如下&am…