Java学习 8.Java-递归

news2024/12/23 18:19:17

一、递归的概念

引例:

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

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

递归的必要条件

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.coloradmin.cn/o/1189729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

介绍两个好用又好玩的大模型工具

先让数字人跟大家打个招呼吧。 我的AI数字人会手语了 发现没&#xff0c;我的数字人本周又学了一个新技能&#xff1a;手语。 这些数字人都是通过AI生成的。 但数字人不是今天的主题&#xff0c;今天要跟大家聊聊大模型。 自从大模型出现后&#xff0c;很多人&#xff08;包…

2022年接口测试总结【温故知新系列】

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…

Centos批量删除系统重复进程

原创作者&#xff1a;运维工程师 谢晋 Centos批量删除系统重复进程 客户一台CENTOS 7系统负载高&#xff0c;top查看有很多sh的进程&#xff0c;输入命令top -c查看可以看到对应的进程命令是/bin/bash     经分析后发现是因为该脚本执行时间太长&#xff0c;导致后续执…

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

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

【深度学习】可交互讲解图神经网络GNN

在正式开始前&#xff0c;先找准图神经网络GNN(Graph Neural Network)的位置。 图神经网络GNN是深度学习的一个分支。 深度学习的四个分支对应了四种常见的数据格式&#xff0c;前馈神经网络FNN处理表格数据&#xff0c;表格数据可以是特征向量&#xff0c;卷积神经网络CNN处理…

基于SSM的楼房销售系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

腾讯蒋杰:坚持用技术服务应用,腾讯混元大模型已接入180多个业务

“腾讯正在持续探索大模型应用场景&#xff0c;目前内部超180项业务已经接入腾讯混元大模型进行内测”&#xff0c;11月9日&#xff0c;腾讯集团副总裁蒋杰在2023年世界互联网大会乌镇峰会上表示。 腾讯集团副总裁 蒋杰 作为腾讯全链路自研的实用级大模型&#xff0c;自2023年…

软件测试工程师的分支有哪些?

各行各业都有很多分支&#xff0c;软件测试的细分领域又有哪些呢&#xff1f; 拆解来说&#xff1a; 功能测试的渠道有&#xff0c;app&#xff0c;小程序&#xff0c;web/h5。其中app和web要考虑兼容性。app需要考虑安卓&#xff0c;鸿蒙&#xff0c;ios这三个系统&#xff0…

使用xlwings获取excel表的行和列以及指定单元格的值

import xlwings as xw app xw.App(visibleFalse) # 隐藏Excel wb app.books.open(文档1.xlsx) # 打开工作簿sht wb.sheets[Sheet1] # 实例化工作表1#获取行数和列数 rows_countsht.range(1, 1).expand().shape[0] cols_countsht.range(1, 1).expand().shape[1] print(row…

设计模式JAVA

1 创建型 如何合理的创建对象&#xff1f; 1.1 单例模式 字面意思就是只能创建一个对象实例时使用。 例如&#xff0c;Windows中只能打开一个任务管理器&#xff0c;这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费&#xff0c;或出现各个窗口显示内容的不一致等…

【跟小嘉学习JavaWeb开发】第一章 开发环境搭建

系列文章目录 【跟小嘉学习JavaWeb开发】第一章 开发环境搭建 文章目录 系列文章目录[TOC](文章目录) 前言一、JDK的下载与安装1.1、关于JDK的版本问题 二、环境变量配置2.1、配置 JAVA_HOME、CLASSPATH2.2、配置path2.3、启动 cmd 三、编写代码、编译并执行3.1、编写代码&…

Spring面试题:(四)Spring Bean生命周期

Bean生命周期的阶段 实例化初始化完成销毁 IoC容器实例化Bean的流程 Bean定义 Bean工厂处理 反射实例化Bean 初始化 完成存储到单例池 Bean生命周期 Bean初始化话过程 属性填充aware接口BeanPostProcessor前置处理InitialzingBean接口初始化方法自定义init方法BeanPost…

2012年计网408

第33题 在 TCP/IP 体系结构中, 直接为 ICMP 提供服务的协议是()A. PPPB. IPC. UDPD. TCP 本题考察TCP/IP体系结构中直接为ICMP协议提供服务的协议。如图所示。这是TCP/IP的四层体系结构。网际层的IP协议是整个体系结构中的核心协议&#xff0c;用于网络互联。网际控制报文协议…

MATLAB中Stem3函数用法

目录 语法 说明 向量和矩阵数据 表数据 其他选项 示例 行向量输入 列向量输入 矩阵输入 使用向量输入指定针状线条位置 使用矩阵输入指定针状线条位置 填充标记 线型、标记符号和颜色选项 线型、标记符号和颜色选项 其他样式选项 绘制表中的数据 特定坐标区上…

【Linux】进程终止

进程退出场景 代码运行完毕&#xff0c;结果正确代码运行完毕&#xff0c;结果不正确代码异常终止 可以用return 的不同的返回值数字&#xff0c;表征不同的出错原因退出码&#xff0c;所以进程运行正不正常我们可以查看退出码来判断&#xff1b; 如果进程异常&#xff0c;退…

Leetcode 第 368 场周赛题解

Leetcode 第 368 场周赛题解 Leetcode 第 368 场周赛题解题目1&#xff1a;2908. 元素和最小的山形三元组 I思路代码复杂度分析 题目2&#xff1a;2909. 元素和最小的山形三元组 II思路代码复杂度分析 题目3&#xff1a;2910. 合法分组的最少组数思路代码复杂度分析 题目4&…

Leetcode124. 二叉树中的最大路径和

Every day a Leetcode 题目来源&#xff1a;124. 二叉树中的最大路径和 解法1&#xff1a;深度优先搜索 思路类似于&#xff1a;Leetcode543. 二叉树的直径&#xff0c;只是考虑对象从边变成了点。 首先&#xff0c;考虑实现一个简化的函数 dfs(node)&#xff0c;该函数计算…

解决 github.com 或者 raw.githubusercontent.com 打开慢、打不开问题

系列文章目录 文章目录 系列文章目录前言一、Windows 系统1.1 以管理员身份运行记事本1.2 打开 hosts 文件1.3 写入 IP 地址 二、Linux2.1 hosts 文件位置 三、Android 系统总结 前言 连接手机热点&#xff0c;将流量关闭马上打开&#xff0c;进入的成功率更高 一、Windows 系…

Linux基础【Linux知识贩卖机】

偶尔的停顿和修整&#xff0c;对于人生是非常必要的。 --随记 文章目录 Linux目录目录结构磁盘分区相关命令 相对路径和绝对路径 文件权限用户分类umask创建文件权限计算方法粘滞位 总结 Linux目录 目录结构 Linux 操作系统采用了一种层次化的目录结构&#xff0c;常被称为标…