java面向对象练习7 递归方法

方法的递归相关练习(Java 实现) 1、递归求 N 的阶乘 import java.util.Scanner; public class Test { //递归求 N 的阶乘 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输... 阅读详情

/*

  • 递归方法,一个方法体内调用其自身。
  • 递归方法包含了一种隐式循环,它会重复执行某段代码,但这种重复执行无需循环控制;
  • 递归一定要想已知方向进行,否则这种递归就变成了无穷递归,类似死循环。

*/

package com.atguigu.contact;
import java.util.*;
public class ObjectRecursion {	
public static void main(String[] args) {
	Scanner scan = new Scanner(System.in);
	//测试递归方法
	System.out.println(new ObjectRecursion().sumNum(100));
	System.out.println(new ObjectRecursion().multiplyNum(100));
	System.out.println(new ObjectRecursion().factorialNum(25));//如果结果超出数据类型容量,则输出0
	System.out.println(new ObjectRecursion().array(10));
	System.out.println(new ObjectRecursion().array1(10));
	//测试斐波那契数列
	int[] arr = new int[30];
	new ObjectRecursion().fibonacciArr(arr,30);
	System.out.println(Arrays.toString(arr));
	int[] arr1 = new int[20];
	new ObjectRecursion().fibonacciArr1(arr1,20);
	System.out.println(Arrays.toString(arr1));
	int[] arr2 = new int[10];
	new ObjectRecursion().fibonacciArr2(arr2,10);
	System.out.println(Arrays.toString(arr2));
	new ObjectRecursion().fibonacciArr3(300);
	//测试汉诺塔
	ObjectRecursion test = new ObjectRecursion();
	int hanoiDisk = 4;
	number n = new number();
    System.out.println(hanoiDisk + "个盘子的汉诺塔需移动" + test.hanoiTower(n,hanoiDisk,1,2,3) + "次");
    //测试快速排序
	int[] array = new int[] {23,67,1,6,23,78,99,11,66,2,71,84,19,25,45,0,-3,-23,5,90,-74};
	System.out.println(Arrays.toString(array));
	long start = System.currentTimeMillis();
	test.quickSort(array, 0, array.length - 1);
	System.out.println(Arrays.toString(array));
	long end = System.currentTimeMillis();
	System.out.println("程序2执行时间=" + ( end - start));
	
	
}
	//递归实现累加
	public int sumNum(int n) {
		if(n == 1) {
			return 1;
		}else {
		return n + sumNum(n - 1);
		}
	}
	//递归实现累乘
	public int multiplyNum(int n) {
		if(n == 1) {
			return 1;
		}else {
		return n * sumNum(n - 1);
		}
	}
	//递归实现阶乘
	public long factorialNum(int n) {
		if(n == 1) {
			return 1;
		}else {
		return n * factorialNum(n - 1);
		}
	}
	//数组递归练习1,向左递归,递归参数n-
	public int array(int n) {
		if(n == 0) {
			return 1;
		}else if(n == 1) {
			return 4;
		}else{
			return array(n - 2) + 2 * array(n - 1);
		}
	}
	//数组递归练习2,向右递归,递归参数n+
	public double array1(int n) {
		if(n == 20) {
			return 1;
		}else if(n == 21) {
			return 4;
		}else{
			return array1(n + 2) - 2 * array1(n + 1);
		}
	}
	//递归输出斐波那契数列
	public int fibonacciArr(int[] arr,int n){		
		if(n == 1) {
			arr[n - 1] = 1;
		}else if(n == 2) {			
			arr[n - 1] = 1;
		}else {
		arr[n - 1] = fibonacciArr(arr,n - 1) + fibonacciArr(arr,n - 2);
		}	
		return arr[n - 1];
	}
	//循环方法输出斐波那契数列, 个数为n
	public void fibonacciArr1(int[] arr,int n){	
		int f1 = 0;
		int f2 = 1;
		int m = n + 1;
		while(--m > 0) { //或者 m-- > 1
			f1 = f1 + f2;
			f2 = f1 - f2;	
			arr[n - m] = f1 ;
		}
	}
	//循环方法输出斐波那契数列,个数为n
	public void fibonacciArr2(int[] arr,int n){	
		int f1 = 0;
		int f2 = 1;			
		for (int i = 0; i < n; i++) {			
			f1 = f1 + f2;
			f2 = f1 - f2;
			arr[i] = f1 ;			
		}
	}
	//循环方法输出斐波那契数列,最大值小于n
	public int fibonacciArr3(int n){	
		int f1 = 0;
		int f2 = 1;		
		int i = 0;
		for (; f1 <= n;) {			
			f1 = f1 + f2;
			f2 = f1 - f2;
			i++;			
		}
		    i -= 1;
		 f1 = 0;
		 f2 = 1;
		int[] arr = new int[i];
		for (int j = 0; j < i; j++) {
			f1 = f1 + f2;
			f2 = f1 - f2;
			arr[j] = f1 ;		
		}
		System.out.println("最大值小于等于" + n + "的斐波那契数列长度为" + i + "。结果如下");
		System.out.println(Arrays.toString(arr));
		return i;
	}
	//汉诺塔问题
	//两个盘子的情况下,1号盘移动到中间,2好盘移动到末尾,1号盘移动到末尾
	//三个盘子的情况下,先将12号盘按照上一步的方法移动到中间,再将3号盘移动到末尾,在将12号盘按上一步的方法移动到末尾
	//n个盘子的情况类似三个盘子的情况,先将n-1个盘子移动到中间,再把n号盘子移动到末尾,再把n-1个盘子移动到末尾。	
	public int hanoiTower(number num,int n,int start,int mid,int end) {	
		num.mark++;//执行一次则步骤计数加1;
		if(n==1) {
			System.out.println(n + "号盘从"+ start + "号位置" +"移动到" + end + "号位置");
		}else{
			hanoiTower(num,n-1,start,end,mid);//n-1号盘从start移动到mid
			System.out.println(n + "号盘从"+ start + "号位置" +"移动到" + end + "号位置");//n号盘移动到末尾
			hanoiTower(num,n-1,mid,start,end);//n-1号盘从mid移动到end
		}
		return num.mark;
	}
	//递归实现快速排序算法
	//快速排序:随机选择一个数组元素作为基准值,遍历数组,把大于基准值的元素放到基准值右侧,小于基准值的元素放在基准值左侧,这样基准值在最终结果的位置确定下了。
	//对基准值左右两侧分别递归以上步骤,最终直到所有元素的最终位置被确定。
	   public void quickSort(int[] a,int low,int high){
	         int start = low;
	         int end = high;
	         int index = a[low];//基准值可以选取数组中任一位置元素
	         
	         while(end > start){
	             
	             while(end > start && a[end] >= index)//从后往前比较 ,直到找到一个元素小于基准值
	                 end--;
	             if(a[end] <= index){//如果此时end位置的元素比基准值小则交换end(此时为找到的元素)与start(此时为基准值)的元素;
	                 int temp = a[end];
	                 a[end] = a[start];
	                 a[start] = temp;
	             }
	           
	             while(end > start && a[start] <= index)//从前往后比较,直到找到一个元素大于基准值
	                start++;
	             if(a[start] >= index){//如果此时start位置的元素比基准值大则交换start(此时为找到的元素)与end(此时为基准值)位置的元素;
	                 int temp = a[start];
	                 a[start] = a[end];
	                 a[end] = temp;
	             }
	         //第一次循环比较结束,基准值的索引位置确定。左边都小于基准值,右边都大于基准值,但是两边的数列顺序还未排好。
	         }
	         //递归步骤
	         if(start > low) {
	        	 quickSort(a,low,start - 1);//左边从第一个索引到基准值索引-1
	         }
	         if(end < high) {
	        	 quickSort(a,end + 1,high);//右边从基准值索引+1到最后一个
	         }
	     }	     
	
}
//创建类number为汉诺塔问题计数准备
class  number{
	int mark;
}
BurpSuite安装配置全攻略:从Java环境到HTTPS抓包实战 Web应用安全测试是网络安全领域的基础实践,其核心在于理解HTTP/HTTPS协议交互与漏洞挖掘原理。中间人代理技术作为关键实现手段,通过拦截和修改网络流量,使安全工程师能够深入分析应用逻辑与潜在风险点。BurpSuite作为集成化测试平台,将代理监听、漏洞扫描、暴力破解等工具模块化,极大提升了手工测试效率与自动化能力。在渗透测试与漏洞挖掘场景中,正确配置Java运行环境与CA证书体系是确保BurpSuite稳定工作的前提,这直接关系到HTTPS流量解密、移动端测试等关键功能的可用性。本文聚焦BurpSui 阅读详情

相关推荐

Java学习-04 面向对象以及快递管理案例练习

Java学习-04 面向对象 这阵子主要学习了Java的面向对象。面向对象是相对于面向过程来讲的,从面向过程到面向对象,是程序员思想上从执行者到指挥者的转变。面向对象强调的是直接以现实中的事物,也就是对象,为中心来思考,认识问题,并根据它们各自的本质特点(共性),把它们抽象为java中的类,这样的方式与现实世界有着更好的映射,而且也更符合人类的思维习惯。 想学好面向对象,光靠看听是远远不够的,一个合格的程序员同时也是一个辛勤的耕耘者,一定要多写代码,只有在练习的过程中,才会去想这个地方怎么做,用什么做,

deemo_hui的博客 2022

Java实现简单的递归操作

在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做“递归”,这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的。虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于一些比较抽象复杂的算法不用递归很难理解与实现。 递归分为直接递归和间接递归,就简单分享一下两个小的直接递归。 对于递归的概念,其实你可以简单的理解为自己定义自己,记得小时候看过一部电视剧《狼毒花》,...

ares_xxm的博客 14万+

RTX 50系列显卡选购指南:从Stable Diffusion到深度学习,哪款最适合你的AI需求?

本文深入分析了RTX 50系列显卡如何满足不同的AI应用需求。针对Stable Diffusion图像生成,强调显存容量是关键;对于大语言模型本地推理,需平衡算力与显存;而深度学习训练则更看重算力效率。文章对比了RTX 5090、5080、5070等型号的核心规格与适用场景,并提供了从入门到专业的实战配置建议,帮助用户根据自身AI工作负载精准选择最具性价比的显卡。

linux6sysadmin的博客 689

java递归简单练习

1.实现代码:递归求N的阶乘 import java.util.Scanner; public class factorial{ public static void main(String[] args){ Scanner input=new Scanner(System.in); System.out.println("请输入你要求的阶乘数:"); ...

sun_105的博客 796

【项目案例】前后端分离项目 【Web图书管理系统 】SpringBoot + Vue + Element UI + Mysql

Web图书管理系统

激流丶的博客 5392

区块链入门:用账本、乐高和三台旧电脑讲懂分布式账本

区块链是一种去中心化的分布式账本技术,其核心原理是通过密码学哈希、共识机制和链式结构实现数据不可篡改与多方共同验证。它不依赖单一中心,而是将交易记录同步复制到多个节点,依靠数学规则而非人工信任达成一致,从而在数字世界构建可验证的信用基础设施。这种‘集体见证’模式显著提升了系统抗单点故障与人为干预的能力,广泛应用于供应链溯源、数字身份、教育管理及公益透明等需强信任保障的场景。本文以账本类比、乐高拆解和Ganache实操为线索,面向零基础读者通俗解析哈希值、挖矿与智能合约等关键概念。

weixin_30517215的博客 274

斐波那契

def fib(max): #10 n, a, b = 0, 0, 1 while n < max: #n<10 #print(b) yield b a, b = b, a + b n = n + 1 return '---done---'g = fib(6)while True: try: ...

weixin_30245867的博客 133

OpenClaw用户必看:每天0成本使用OpenClaw!NVIDIA NIM免费大模型接入教程

🚀 OpenClaw接入NVIDIA NIM免费API!glm5、minimax-m2.5等大量模型任选,0成本升级AI助手!💰

XiaoqiangClub的博客 5573

非零基础自学Java (老师:韩顺平) 第7章 面向对象编程(基础部分) 7.4 方法递归调用

非零基础自学Java (老师:韩顺平) 第7章 面向对象编程(基础部分) 7.4 方法递归调用

代码改变世界 460

2026最新YOLO26改进:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

针对YOLO26模型改进痛点,本专栏整理200+实战验证方法,覆盖卷积层、注意力机制等核心模块。 每种方法含原理、性能分析、改进路径及实操流程,代码可直接运行,快速提升模型效果,性价比超高。

魔改工程师的博客 1万+

华为OD机考双机位C卷 - 评委评分 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 评委评分 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1750

Java连载31-递归方法练习、面向对象

一、实现阶乘(一种用递归,一种普通方法) public static void main(String[] args) { System.out.println(factorial(5)); System.out.println(factorial_recursion(5)); } //普通循环结构实现阶乘 public static int factorial(int...

weixin_44630050的博客 185

vue3:实现飞书扫码授权登录流程+完整示例源码,用户使用飞书移动端扫描飞书登录二维码进行登录后获取用户信息数据,vue3接入飞书登录系统,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码)

vue3飞书扫码登录网页,vue3飞书扫码登录网页,vue3接入飞书扫码登录全流程,Vue3在网页中接入飞书二维码SDK,vue3飞书扫码登录网页,实现用户授权登录的流程,Vue3集成飞书前端JSSDK,对接飞书扫码授权,飞书扫码授权,vue3网站集成飞书登录生成二维码,VUE3用户扫码飞书授权登录,飞书开发-网页应用JSSDK鉴权流程,飞书开放平台自建网页应用登录与免登录,vue3接入二维码SDK将飞书登录的二维码嵌入到网页中,pc后台管理系统接入飞书登录,vue3项目中实现扫码登录飞书,Vue飞书免登录

✅ 精选推荐文章 4390

JAVA的方法、方法重载(overlord)、递归、面向对象中类、成员变量、方法的使用

主要内容:方法方法的优点方法的命名规范方法的定义方法的调用方法的重载重载的含义递归递归总结面向对象 方法 我们在之前几个文章中从来没有提起过方法,那么方法是用来做什么的? 方法就是用来解决一类问题的组合。 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 方法的优点 使程序变得更简短而清晰。 有利于程序维护。 可以提高程序开发的效率。 提高了代码的重用性。 方法的命名规范 在最开...

程序小白的成长 1671

从0到1带大家搭建spring cloud alibaba 微服务大型应用框架(十一)spring-boot-admin 监控篇(2)springcloud 集成spring boot admin

从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十一)spring-boot-admin 监控篇(2)springcloud 集成spring boot admin spring-boot-admin 服务端创建与集成入nacos spring-boot-admin 查看日志

峡谷电光马仔的博客 1378

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java005方法定义和递归的练习

一,在java中如何定义一个函数:函数就是方法,在面向对象中就叫做方法,在main函数之前定义,使用时可以直接调用,更加方便简洁。 模式1:如果方法中的返回值是void,后面不加return+数据;但是可以直接加return;,提前结束一个方法 public stasic void f1(){}//void返回值类型 ...

weixin_44699728的博客 409

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java基础 day05-递归,递归练习题,面向过程和面向对象,类和对象,数组,数组练习题

递归 方法自己调用自己 栈内存溢出错误:StackOverflowError 合法的递归条件也有可能发生递归错误,压栈太深,导致溢出 在实际开发中不建议使用递归,能用循环的尽量用循环,因为循环效率高,耗费的内存少,递归使用不当,会导致JVM死掉,但有时候,只能用递归实现。 实际开发中,栈溢出错误怎么解决: 先检查递归条件是否出错,若出错,修改至正确。 条件没问题的话,需要手动调整JVM的栈内存初始化内存大小,可以将栈内存调整大一些。 (java -X)这个可以查看调整堆栈的大小参数。 jav

weixin_43734992的博客 714

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java递归、数组、排序、面向对象和构造方法

递归 概述 递归 : 就是在当前方法中, 调用自己 基本思想 : 以此类推 递归和迭代是等价的 , 而迭代就是循环 , 所以递归也是重复做某件事 三要素 : 初始值 , 终止条件 , 步长 如果循环能做到的 , 就不要使用递归 , 因为递归效率低 , 比较耗内存 应用场景 : 一般树状结构 , 需要使用...

Lakn_an的博客 308

java入门笔记04之面向对象编程+方法+递归

抽象方法–接口–多态 由abstract修饰 只有方法的定义,没有具体的实现(连{}都没有) 抽象类: 由abstract修饰 包含抽象方法的类必须是抽象类 抽象类不能被实例化(new对象) 抽象类是需要被继承的,派生类: 重写所有抽象方法-----------------变不完整为完整 也声明为抽象类---------------------一般不这么用 抽象类的意义: 封装共有的属性和行为---------------代码复用 为所有派生类提供统一的类型------向上造型 可以包含抽象方法,为所有派生

weixin_44230894的博客 222

java基础day04:方法(函数),练习

​5、亲密数:如果A的所有因子之和(含1而不含本身)等于B,而且B的所有因子之和 (含1而不含本身)等于A,那么A/B称之为一对亲密数。例 如,1996 年是闰年,而相应的,1993 年就不是闰年。5、在方法中可以使用return表示结束当前方法的执行,如果return之后有值,则表示结束方法并带有返回结果。2、定义一个方法,判断输入的数是否为质数,是则返回true,否则返回false。在同一个类中,如果出现多个方法名称,但是参数列表不同,这种方法称为方法重载。通过类调用: 类.方法名(参数列表);

weixin_62189092的博客 1129

【面向对象程序设计(Java)】 7-3 递归方法

第1关:猴子摘桃(递归问题) 任务描述 本关任务: 猴子吃桃问题:小猴子摘了一堆桃子。第一天吃掉一半又多吃了1个,第二天吃了剩下的一半又多吃1个,以后每天都吃掉剩下的一半多一个。第10天发现只剩一个桃子了。问第一天摘了多少桃子?第二天还有多少桃子?第三天…… 编写方法peach(int day),计算第day天的桃子数。 在main()方法中输入day(1~10),即你想知道第day天小猴子有多少桃子,调用peach()方法求该天的桃子数。 相关知识 为了完成本关任务,你需要掌握:1. 递归问题分析。 比如

qq_63683485的博客 1537

Java面向对象之-方法(超详细)

本文详细介绍了Java面向对象的方法概念、声明、使用等。

weixin_52176709的博客 1349

Java300集(六)递归方法

方法 设计方法原则:方法的本意是功能块,就是实现某个功能的语句块的集合。设计方法的时候最高保持方法的原子性,就是一个方法只完成一个功能,利于后期的扩展。 package com.shangxuetang.chapter7; public class TestBreakContinue { public static void main(String[] args) { ...

毛依依的博客 193

递归以及面向对象

递归 1、一个方法自己调用自己,叫做递归。 2、递归的逻辑很简单清晰,但是需要调用的内存较大。 实例:用递归求斐波那契数列的第几项。 import java.util.Scanner; /** * 用递归求斐波那契数列第N项 * */ public class Text02 { public static void main(String[] args) { Scanner inp...

lclsj479的博客 427

JAVA_基础面向对象思想概述、基本介绍及方法的重载与递归(一)

面向对象 什么是面向对象 java类及类的成员:属性、方法、构造器、代码块、内部类 面向对象的三大特点:封装性、继承性、多态性、(抽象性) 其它关键字:this、super、static、final、abstract、interface、package、import等 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。 面向对象:强调具备功能的对象,以类/对象为最小单位,考虑谁来做。 面向对象的思想概述 类(Class)和对象(Object)是是面向对象的核心概念 类是对一类事物的描述,是抽象的、

SixFeet Under的博客 147
上一篇: java面向对象练习6 方法形参的值传递机制测试
下一篇: java面向对象练习8 封装性与权限修饰符
wisdomcodeinside
博客等级 码龄7年 29粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值