【Java】/*方法的递归*/

目录

一、递归的概念

二、递归执行过程分析

三、递归练习

3.1 按顺序打印一个数字的每一位,例如123打印出1 2 3

3.2 递归求 1 + 2 + 3 + ... + n 的和

3.3 输入一个非负整数,返回组成它的数字之和,例如123,得1+2+3

3.4 求斐波那契数列的第 N 项


一、递归的概念

1. 生活中例子:

从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:

"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:

"从前有座山,山上有座庙..."

"从前有座山……" "

像这种自身中又包含了自己的现象,在数学和编程中非常有用,因为有些时候,我们遇到的问题直接并不好解决,但是会发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,这样的话子问题解决之后,原问题也就会迎刃而解了。

2. 递归的概念:一个方法在执行过程中调用自身,就称为 "递归",与上面生活中的例子不同的是,递归不是无限递归,它必须有一个递归结束的条件。

3. 在程序层面要完整的写出一个递归需要两个必备的条件:

    ① 起始条件:可以理解为递归结束的条件

    ② 递归公式:每个问题的递推公式是不一样的,例如求N!,可以转换成求 N+(N-1)!

4. 递归的缺点:空间复杂度高,能用迭代的就不要用递归

二、递归执行过程分析

1. 要想弄清楚递归执行的过程,通常会通过画图的方式进行理解,下面以求N!为例进行分析

2. 思路:假如要求3!,通过分析我们可以将其拆分为求3*2!,而2!又可以拆分为求2*1!,很明显可以看出我们在做一件重复的事,即求一个数的阶乘里面又可以看成求一个数的阶乘,而我们知道1!=1,因此这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

3. 求解的代码思路为,定义一个求阶乘的方法,如果n==1,就返回1,否则返回n*fac(n-1),递归执行的过程,见下图图片所示。

    public static int fac(int n) {if (n == 1) {return 1;}return n * fac(n - 1);}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();System.out.println(fac(n));}

三、递归练习

3.1 按顺序打印一个数字的每一位,例如123打印出1 2 3

思路:打印123的每位,可以看成先打印12(123/10)的每位,再打印3(123%10),打印12的每位可以看成先打印1(12/10)的每位,再打印2(12%10),而我们知道当要打印的数为小于10的数时,直接打印即可,这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

求解的代码思路:定义一个求打印一个数字每位的方法,如果n < 10,直接打印并返回,否则返回n*printNum(n-1),递归执行的过程,见下图图片所示。

    public static void printNum(int n) {if (n < 10) {System.out.printf("%d ", n);return;}printNum(n / 10);System.out.printf("%d ", n % 10);}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();printNum(n);}

3.2 递归求 1 + 2 + 3 + ... + n 的和

思路:当n=3时,表示我们要求3~1之间整数的和,这个式子又可以看成3加2~1之间整数的和,2~1之间整数的和又可以看成求2加1~1之间整数的和,而1~1之间整数的和就是1,这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

求解的代码思路:定义一个求n~1之间整数和的方法,如果n == 1,直接返回1,否则返回n+addNum(n-1),递归执行的过程,见下图图片所示。

    public static int addNum(int n) {if (n == 1) {return 1;}return n + addNum(n - 1);}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();System.out.println(addNum(n));}

3.3 输入一个非负整数,返回组成它的数字之和,例如123,得1+2+3

思路:假设我们要求组成123每一位数字的和,可以看成求3(123%10)加组成12(123/10)每一位数字的和,求组成12每位数字的和,又可以看成求2(12%10)加组成1(12/10)每一位数字的和,当我们要求的和的数小于10时直接返回即可,这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

求解的代码思路:定义一个求组成某数字的每位和的方法,如果n < 1,直接返回n,否则返回 n%10 + numAdd(n/10),递归执行的过程,见下图图片所示。

    public static int numAdd(int n) {if (n < 10) {return n;}return n % 10 + numAdd(n /10);}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();System.out.println(numAdd(n));}

3.4 求斐波那契数列的第 N 项

什么是斐波那契数列:斐波那契数列 - 搜狗百科 (sogou.com),指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,即从第3项开始,每一项都等于前两项之和。

思路:如果我们要求斐波那契数的第n项,那么求得斐波那契数的第n-1项和n-2项之和即可,而求斐波那契数的第n-1项,又可以看作求斐波那契数的第n-2项和n-3项之和...,如果n为1则直接返回0即可,如果n为2则直接返回1即可,这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

求解的代码思路:定义一个求斐波那契数第n项的方法,如果n == 1,直接返回0,否则如果n == 2返回1,否则返回 fib(n-1) + fib(n -2),递归执行的过程,见下图图片所示。

    public static int fib(int n) {if (n == 1) {return 0;} else if (n == 2) {return 1;}return fib(n - 1) + fib(n - 2);}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();System.out.println(fib(n));}

但当我们求 fib(40) 的时候发现, 程序执行速度极慢,原因是进行了大量的重复运算,如在上面基础上加上一个成员变量,当n=40时,记录fib(1)一共计算了多少次,结果为39088169次。因此本道题不适合用递归的方式求,而更适合用迭代的方式求。

    public static int count = 0;//成员变量,实现累加public static int fib(int n) {if (n == 1) {count++;return 0;} else if (n <= 2) {return 1;}return fib(n - 1) + fib(n - 2);}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();System.out.println(fib(n));System.out.println(count);}

(以后求斐波那契数列的第 N 项都用迭代的方法)

思路:我们可以定义fib3、fib2、fib1分别表示要求的第n项,和第n-1项、第n-2项,如果是要求第1项或第2项的斐波那契数,特殊处理返回即可;当n>=3时,n-2等于几就执行几次求 fib3 和更新fib1、fib2的操作,循环结束后fib3就是斐波那契数列的第n项项的值。

    public static int fib2(int n) {int f1 = 0;int f2 = 1;int f3 = 1;/*前两项特殊处理*/if (n == 1) {return 0;} else if (n == 2){return 1;}/* n>=3时 */for (int i = 3; i <= n; i++) {f3 = f1 + f2;f1 = f2;f2 = f3;}return f3;}

   本篇文章已完结,谢谢支持哟 ^^ !!!

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

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

相关文章

Android AOSP Ubuntu源码编译电脑卡顿问题定位解决

文章目录 问题概述分析问题解决问题查看交换分区创建交换分区删除交换分区调整交换分区的活跃度 问题概述 开发SystemUI时&#xff0c;使用内存为16G的主机&#xff0c;Ubuntu 20.04的系统编译SystemUI的源码&#xff0c;编译的过程中发现电脑卡顿&#xff0c;鼠标不能移动。必…

Docker学习笔记(一)安装Docker、镜像操作、容器操作、数据卷操作

文章目录 1 Docker介绍1.1 Docker的优势1.1.1 应用部署的环境问题1.1.2 Docker解决依赖兼容问题1.1.3 Docker解决操作系统环境差异1.1.4 小结 1.2 Docker和虚拟机的区别1.3 Docker架构1.3.1 镜像和容器1.3.2 DockerHub1.3.3 Docker架构 1.4 安装Docker1.4.1 卸载旧版本Docker&a…

【qt】纯代码界面设计

界面设计目录 一.界面设计的三种方式1.使用界面设计器2.纯代码界面设计3.混合界面设计 二.纯代码进行界面设计1.代码界面设计的总思路2.创建项目3.设计草图4.添加组件指针5.初始化组件指针6.添加组件到窗口①水平布局②垂直布局③细节点 7.定义槽函数8.初始化信号槽9.实现槽函数…

盛邦安全荣获北京市海淀区上地街道财源建设工作表彰

近日&#xff0c;盛邦安全受邀出席上地街道2024年第一季度财源建设工作联席会暨上地人工智能产业报告发布大会并收到上地街道颁发的感谢信&#xff0c;这是对公司技术创新、管理提升、营收增长&#xff0c;持续为上地地区财源建设做出突出贡献的鼓励。 盛邦安全副总裁、董事会秘…

ApiHug Official Website

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | MarketplaceApiHug-H…

TCP的延时应答和捎带应答详解

一、延时应答 延时应答是指TCP接收方在接收到数据包后&#xff0c;并不立即发送确认&#xff08;ACK&#xff09;消息&#xff0c;而是等待一段时间&#xff0c;以期望在该时间段内收到更多的数据包&#xff0c;从而实现合并多个ACK消息为一个&#xff0c;减少网络中的确认消息…

全民拼购:被低估的商机,惊人的业绩潜力

今日&#xff0c;我要与大家探讨的是一种似乎被遗忘&#xff0c;但实则蕴含巨大商机的模式与策略。尽管它在外界看来或许并不起眼&#xff0c;但我的一位客户却凭借这一策略&#xff0c;实现了令人瞩目的业绩——日销售额逼近五千万&#xff0c;日订单量更是高达惊人的300万单。…

[C++基础编程]----预处理指令简介、typedef关键字和#define预处理指令之间的区别

目录 引言 正文 01-预处理指令简介 02-typedef关键字简介 03-#define预处理指令简介 04-#define预处理指令和typedef关键字的区别 &#xff08;1&#xff09;原理不同 &#xff08;2&#xff09;功能不同 &#xf…

TEA: Temporal Excitation and Aggregation for Action Recognition 论文阅读

TEA: Temporal Excitation and Aggregation for Action Recognition 论文阅读 Abstract1. Introduction2. Related Works3. Our Method3.1. Motion Excitation (ME) Module3.1.1 Discussion with SENet 3.2. MultipleTemporal Aggregation(MTA) Module3.3. Integration with Re…

QT如何增删安装的组件

打开 uninstall QT 往下会看到让你选择 add or remove component。 接下去就可以修改组件了

Python快速入门-零基础也能掌握的编程技巧,基础方法和API整理

目录 前言 数据结构 数字 数学运算 随机数 字符串 列表 元组 字典 面向对象 JSON 文件操作 扩展 制作一个简易时钟 前言 环境什么就不在赘述&#xff0c;可以参考其他文章&#xff0c;也可以在线运行 CSDN在线运行地址&#xff1a;InsCode - 让你的灵感立刻落地…

Amesim基础篇-热仿真常用模型库-Thermal Hydraulic /Resistance

有言在先 流体库、管路库在热管理中是必备模块&#xff0c;如动力电池液冷循环系统均需要Thermal Hydraulic /Resistance库的元件建模。 1 流体物性设置 AMEsim中内嵌了大部分液冷的热物性&#xff0c;直接在流体子模型上选择即可。常规使用的是50%乙二醇水溶液&#xff0c;如…

水表智能抄表系统是什么?

水表智能抄表系统是一种现代化水资源保护专用工具&#xff0c;它利用先进的物联网、云计算和大数据剖析&#xff0c;完成了智能抄表、实时监控系统、数据分析等作用&#xff0c;大大提高了水务管理的效率和精确性。 1.功能特点 1.1远程控制自动抄表 传统水表抄水表方法采用人…

sentinel-dashborard下发流控规则未生效排查解决

Sentinel简介 Sentinel是阿里巴巴开源的一个流量控制组件&#xff0c;它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel的核心思想是&#xff1a;通过动态设置的规则&#xff0c;对进入系统的流量进行控制&#xff0c;…

C#知识|将选中的账号信息展示到控制台(小示例)

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 上篇学习了控件事件的统一关联&#xff0c; 本篇通过实例练习继续学习事件统一处理中Tag数据获取、对象的封装及泛型集合List的综合运用。 01 实现功能 在上篇的基础上实现&#xff0c;点击选中喜欢的账号&#xff0…

如何将Hyper-V转VMware?反之亦可

为何要在Hyper-V和VMware之间进行转换呢&#xff1f; 尽管VMware和Microsoft Hyper-V都是当前流行的一类虚拟机监控程序&#xff0c;但它们并不相互兼容。VMware产品使用VMDK格式创建虚拟磁盘&#xff0c;而Hyper-V则使用VHD或VHDX格式创建虚拟磁盘。 有时您可能需要进行这种转…

Edge视频增强功能

edge://flags/#edge-video-super-resolution 搜索Video查找 Microsoft Video Super Resolution 设置为Enabled

凸优化理论学习一|最优化及凸集的基本概念

文章目录 一、优化问题&#xff08;一&#xff09;数学优化&#xff08;二&#xff09;凸优化 二、凸集&#xff08;一&#xff09;一些标准凸集&#xff08;二&#xff09;保留凸性的运算&#xff08;三&#xff09;正常锥和广义不等式&#xff08;四&#xff09;分离和支撑超…

计数问题C++

题目&#xff1a; 思路&#xff1a; 1~n之间进行循环遍历&#xff0c;如果i不等于0继续循环&#xff0c;然后求出i的个位数与十位数&#xff0c;如果个位数为要查找的特定数字&#xff0c;计时器就1. 代码&#xff1a; #include<iostream> using namespace std; int n,x…

短视频收益分成一览表​​​​​​​​​​​​​​​​,视频号怎么做有收益的

今日为大家揭秘一个热门视频号的操作技巧。很多人都已经操作这类账号&#xff0c;并从中获益。视频号目前是市场上非常热门的平台之一&#xff0c;流量之大令人惊叹&#xff0c;先不提那些私域营销的巨大优势&#xff0c;仅从创作分成计划角度来看&#xff0c;已有许多人每天能…