10/8

news/2025/10/8 17:18:06/文章来源:https://www.cnblogs.com/1314521A/p/19129866

Java方法与递归学习实践总结

在Java方法章节的学习中,我最大的收获并非仅仅掌握了语法规则,而是体会到“结构化编程”背后的思维逻辑——用“方法”将复杂问题拆解、复用,用巧劲替代重复的蛮力,这与课件中“懒人造就方法”的理念不谋而合。以下是我对课程中所有动手动脑问题及实验任务的文字梳理与思考。

一、基础方法实践:从重复劳动到一次构建

1.1 自定义功能的方法化思考

课件中“求平方数”的示例让我明白,方法的核心价值是“一次编写,多次调用”。我尝试将“计算平方”的逻辑扩展到不同数据类型:不仅能处理整数,还能适配浮点数。在这个过程中,我特意加入了参数合法性的前置思考——虽然平方运算本身不会因输入负数出错,但这种“先判断、再执行”的习惯,为后续处理更复杂的功能(如开平方需排除负数)打下了基础。

更重要的是,这种多类型适配的思路,让我在未学习“方法重载”时,就自然想到了“用同名逻辑处理不同输入”,后续接触重载概念时,瞬间理解了其设计初衷——让调用者无需记忆多个不同名称的方法,只需关注输入的参数类型即可。

1.2 随机数生成的多场景适配

随机数是编程中常用的功能,课件提供了三种实现路径,我通过实践对比了它们的适用场景:

第一种是用 Math.random() 生成简单随机数,比如生成0-5的整数,只需通过数值范围换算即可实现。这种方式的优势是代码简洁,适合对随机性要求不高的简单场景,比如模拟掷骰子的基础功能,但缺点是生成范围需要手动计算,灵活性较低。

第二种是使用 Random 类。我发现当种子固定时,生成的随机数序列会完全重复,这让我理解了“种子”就像随机数的“起点密码”;而用当前时间作为种子( System.currentTimeMillis() ),就能避免序列重复,适合需要真实随机性的场景,比如游戏中的随机事件触发。

第三种是手写线性同余随机数算法,按照课件中的数学公式(下一个数等于当前数乘以系数、加常数后取模),生成1000个随机数。这个过程让我看清了“伪随机数”的本质——看似无规律的序列,实则由固定算法驱动,虽然日常开发中很少需要手动实现,但这种底层原理的理解,让我对“随机数”的认知更立体。

二、方法进阶:重载与可变参数的灵活适配

2.1 方法重载的本质:同名不同“参”

课件中“计算不同类型平方”的重载示例,让我彻底理清了重载的判断规则。我通过扩展“加法功能”进一步验证:同样是“add”方法,既可以接收两个整数,也能接收三个整数,还能接收两个浮点数。这三个方法名称相同,但参数的“类型”或“个数”不同,编译器会根据调用时的输入自动匹配对应的方法。

我特意去查看了JDK中 System.out.println() 的实现,发现它有十多种重载形式,分别对应整数、浮点数、字符串等不同输入类型——这正是重载在实际开发中的典型应用:让同一个功能名称适配多种场景,降低调用者的记忆成本。同时我也明确了一个关键原则:方法的返回值类型不能作为重载的判断依据,因为调用时无法通过返回值反推要使用哪个方法。

2.2 可变参数的场景化应用

可变参数解决了“参数个数不确定”的痛点。课件中“求多个数最大值”的示例给了我启发,我尝试用同样的思路实现“计算多个数的平均值”。在这个过程中,我首先考虑了边界情况:如果没有传入任何参数,直接计算平均值会出现除以0的错误,因此需要先判断参数长度,若为空则返回0。

通过实践我还掌握了可变参数的使用规则:它必须放在参数列表的最后,否则编译器无法区分后续参数是否属于可变参数的一部分。比如不能先写可变参数再写固定参数,因为无法判断固定参数是独立参数,还是可变参数的一员。这种“边界规则”的理解,让我在使用时避免了语法错误。

三、递归思维:从数学逻辑到代码实现

3.1 阶乘递归的层层拆解

递归最直观的感受是“自己调用自己”,但真正的核心是“将大问题拆解为小问题,直到触达边界条件”。在实现阶乘计算时,我先梳理了数学逻辑:n的阶乘等于n乘以(n-1)的阶乘,而1的阶乘是1(这就是边界条件)。按照这个逻辑,计算10的阶乘,会先拆解为10乘以9的阶乘,9的阶乘再拆解为9乘以8的阶乘,直到拆解到1的阶乘,再反向推导得到最终结果。

但实践中遇到了一个关键问题:当n的值超过20时,结果出现了负数。这正是课件中提到的“int类型溢出”——int类型的最大值约为21亿,而20的阶乘已经超过了这个范围。后来我用课件中提到的BigInteger类优化,这个类可以支持任意大小的整数运算,即使计算100的阶乘也能得到正确结果。这让我明白:递归不仅要保证逻辑正确,还要考虑数据范围对结果的影响。

3.2 递归与递推的场景对比

为了更深入理解两种思路的差异,我以“计算斐波那契数列第n项”为例,分别用两种方式推导:

递归的思路是“从后往前拆”:要得到第n项,需先知道第n-1项和第n-2项,以此类推,直到拆到第1项和第2项(均为1),再反向累加。这种方式的优势是逻辑清晰,代码简洁,但缺点也很明显——会重复计算大量中间值(比如计算第5项时,第3项会被计算两次),数据规模越大,效率越低。

递推的思路则是“从前往后算”:先确定第1项和第2项的值,再依次计算第3项(第1+第2)、第4项(第2+第3),直到算出第n项。这种方式通过循环实现,没有重复计算,效率更高,但代码的“数学感”稍弱。

通过对比我总结出规律:递归适合逻辑简单、数据规模小的场景,比如树形结构的遍历;递推(循环)适合数据规模大、对效率要求高的场景,比如大规模数列计算。实际开发中,不能只追求代码简洁,还要结合场景选择更合适的方式。

四、数据处理陷阱:大整数与浮点数的细节把控

4.1 整数溢出的规避策略

课件中“阶乘出现负数”的案例,让我深刻认识到计算机存储数值的“边界限制”——int类型仅占32位,最大值约21亿,超过这个范围就会出现“溢出”,导致结果错误。除了用BigInteger类处理大整数,我还思考了另一种规避方式:在计算前先判断是否会溢出。

比如两个整数相加时,若其中一个数为正数,就检查另一个数是否超过“最大值减去当前数”的范围;若为负数,则检查是否低于“最小值减去当前数”的范围。这种“先判断、再计算”的策略,虽然增加了思考步骤,但能在源头避免错误结果,尤其适合对数据准确性要求极高的场景(如金融计算)。

4.2 浮点数比较的误差认知

直接用“==”比较浮点数的坑,我在实践中深有体会。比如课件中提到的“0.0001”和“0.00010000000000000001”,从数学上看略有差异,但计算机存储浮点数时会因二进制转换产生误差,导致直接比较时结果为“相等”。

正确的做法是比较两者差值的绝对值是否在允许的误差范围内。我通常会设置一个极小的阈值(比如10的负10次方),只要差值的绝对值小于这个阈值,就认为两个浮点数相等。比如判断“0.1+0.2”是否等于“0.3”时,直接比较会返回错误,但用这种“差值判断法”就能得到正确结果。这让我明白:浮点数计算不存在“绝对相等”,只能追求“在误差范围内相等”。

五、实践反思:从知识积累到思维升级

回顾这些实践,我最大的收获不是记住了“方法重载的三个条件”或“递归的边界规则”,而是建立了“结构化整理知识”的习惯。就像课件中“整理书桌”的比喻,我将学到的内容按“场景→方法→原理”分类:比如随机数生成,分为“简单场景用Math.random()”“通用场景用Random类”“底层原理用线性同余算法”,让零散的知识点变成有序的知识网络,下次遇到类似问题时,能快速定位到合适的解决方案。

同时我也发现了自己的不足:在设计递归逻辑时,还需要更多练习才能摆脱“想不清楚拆解步骤”的困境;在处理数据边界(如溢出、浮点数误差)时,往往要等到出现错误才会察觉,缺乏主动预判的意识。后续学习中,我会继续积累这些“细节陷阱”的处理经验,把每次实践中的问题和解决方案整理成笔记,让编程从“能实现功能”升级为“能高效、可靠地实现功能”。

需要我帮你提炼这篇总结的核心要点,生成一份适合博客园文章开头的摘要吗?这样能让读者快速了解文章内容,提升阅读体验。

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

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

相关文章

2025.10.8

file:///C:/Users/lenovo/Desktop/Java%20%E6%A0%B8%E5%BF%83%E5%9F%BA%E7%A1%80%E5%AE%9E%E9%AA%8C%E6%96%87%E6%A1%A310.8.docx

【QT】QString 与QString区别 - 教程

【QT】QString& 与QString区别 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

[Python/地图] 基于Python绘制地图

0 概述:基于Python绘制地图 1 基于 PyEcharts 绘制地图 PyEchart库pyecharts 是一个基于 百度开源的 Apache ECharts 的 Python 数据可视化库。ECharts 是一个使用 JavaScript 实现的开源可视化库,而 Pyecharts 则是…

常德网站开发哪家好如何制作自媒体短视频

全球领先的企业软件创新者VMware(NYSE:VMW) 今日在VMworld 2020大会上,宣布升级Tanzu对VMware Cloud on AWS、Azure VMware Solution 和Oracle Cloud VMware Solution的支持,同时与GitLab展开合作。在VMworld 2019美国…

【从前端到后端导入excel资料实现批量导入-笔记模仿芋道源码的《系统管理-用户管理-导入-批量导入》】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

开发网站的基本原则网络购物平台有哪几个

在使用 Kotlin 和 Jetpack Compose 进行 Android 开发时,选择正确的单位来设置视图尺寸、间距和字体大小是非常重要的。这些单位确保应用在各种设备和屏幕尺寸上都能保持良好的布局和可读性。 三种常用的单位 1. Density-independent Pixels (dp) 用途&#xff1…

实验任务1——8

实验1 #include <stdio.h>int main(){ printf(" O\n"); printf("<H>\n"); printf("I I"); return 0;}#include <stdio.h>int main(){ printf(" O\t O\n");…

laya 武器旋转砍怪判断

laya 武器旋转砍怪判断typescript代码:export interface IMonster extends Laya.Node {id: number;isDie:boolean;getPoint(): Laya.Point;getHitRect():Laya.Rectangle; }export class Monster extends Laya.Sprite i…

完整教程:将音频数据累积到缓冲区,达到阈值时触发处理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:Android studio初体验

实用指南:Android studio初体验2025-10-08 17:01 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

一款专门为 WPF 打造的开源 Office 风格用户界面控件库

前言 今天大姚给大家分享一款专门为 WPF 打造的开源(MIT license)、免费的 Office 风格用户界面控件库:Fluent.Ribbon。 项目介绍 Fluent.Ribbon 一个为 Windows Presentation Foundation(WPF)实现类 Office 开源…

一款专门为 WPF 打造的开源 Office 风格用户界面控件库

前言 今天大姚给大家分享一款专门为 WPF 打造的开源(MIT license)、免费的 Office 风格用户界面控件库:Fluent.Ribbon。 项目介绍 Fluent.Ribbon 一个为 Windows Presentation Foundation(WPF)实现类 Office 开源…

部门网站建设内容方案莆田市的网站建设公司

微信小程序页面传值为对象[Object Object]详解 1、先将传递的对象转化为JSON字符串拼接到url上2、在接受对象页面进行转译3、打印结果 1、先将传递的对象转化为JSON字符串拼接到url上 // info为对象 let stationInfo JSON.stringify(info) uni.navigateTo({url: /pages/statio…

网站建设后运维合同湖北省市政工程建设官方网站

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过cpolar 内网穿透软件实现ssh 远程连接kali! 1. 启动kali ssh 服务 默认新安装的kali系统会关闭ssh 连接服务,我们通…

给Ubuntu用户的SSH免密登入公钥文件和文件夹设置权限

给Ubuntu用户的SSH免密登入公钥文件和文件夹设置权限摘要 以root身份登入了Ubuntu,把其他用户的公钥加入其$home/.ssh/authorized_keys文件后,需要设置文件和文件夹的权限。 在配置 SSH 免密登录时,.ssh 目录和 aut…

dockercontainerd代理设置脚本

具体脚本 root@ubuntu-21:~# cat RQproxy.sh #!/bin/bash #用于docker或者containerd开启代理#####################修改成自己的代理的ip+port########################### httpipp=Environment="HTTP_PROXY=htt…

建设部网站官网证书查询广东深圳宝安区

科技观潮techsina与浪同行打造一个自己能全局掌控的硬件一个自己完全掌控的系统找人来开发App创造生态繁荣。让它有用、好用&#xff0c;让更多人用——这一系列动作&#xff0c;我们曾在iPhone的历史上都亲眼见证过。出品 / 新浪科技 ID&#xff1a;techsina作者 / 晓光视频 /…

php开发网站优势怎么做自己的销售网站

BOM&#xff08;Bill of Material&#xff09;物料清单 BOM&#xff08;Bill of Material&#xff09;物料清单&#xff0c;是计算机可以识别的产品结构数据文件&#xff0c;也是ERP的主导文件。BOM使系统识别产品结构&#xff0c;也是联系与沟通企业各项业务的纽带。ERP系统中…

阿里云能做网站么如何查网站是哪个公司做的

在MATLAB中&#xff0c;我们经常需要绘制图形并进行一些自定义的操作。在本示例中&#xff0c;我们将演示如何在MATLAB中绘制一个图形&#xff0c;并通过放大某个特定的区域来突出显示。 ## 原始图形 首先&#xff0c;我们绘制了一个包含正弦和余弦函数的图形。 % MATLAB 代…