课后作业

编写一个方法,使用特定算法(Modulus=2³¹-1=int.MaxValue,Multiplier=7⁵=16807,C=0,公式为
x n+1=(ax n+c)modm
)生成指定数目(如 1000 个)的随机整数。
分析给定的 MethodOverload 类代码,找出其特殊之处,并理解方法重载特性。
代码分析
该类中定义了两个名为 square 的方法,一个参数类型为 int,返回值类型为 int;另一个参数类型为 double,返回值类型为 double。
这体现了 Java 的方法重载特性,满足方法名相同,参数类型不同的重载条件,通过不同的参数类型,实现了对整数和小数分别求平方的功能,在 main 方法中,根据传入参数的类型,会自动调用对应的 square 方法。
拓展思考:查看 JDK 中 System.out.println () 方法,发现该方法也存在多种重载形式,参数类型包括 int、double、String、boolean 等多种类型,可根据不同类型的参数,将对应的数据输出到控制台,这也是方法重载在实际 API 中的典型应用,方便开发者根据不同的数据类型灵活调用输出方法。

问题描述:通过实例(求 n!)理解递归,掌握递归编程的模式,并对比递归与递推两种实现方式。
递归求 n! 实现
递归公式:
f(n)=n×f(n−1)
,递归结束条件:当 n=1 或 n=0 时,返回 1。
编程实现时,在递归函数开头先判断是否满足结束条件,若满足则返回 1;若不满足,则按照递归公式调用自身,传入参数 n-1,计算出 (n-1)! 后,再乘以 n 得到 n! 并返回。
需注意递归调用的深度,避免因 n 值过大导致栈溢出问题,对于较大的 n,可考虑其他更优的实现方式或对递归进行优化。
递归与递推对比
递归是 “由后至前再回来”,要求第 n 项,先求第 n-1 项,直至倒推到可计算的初始项(如 n=1 时的 1!),再逐步返回计算出最终结果,代码逻辑相对简洁,但可能存在栈溢出风险,且执行效率相对较低。
递推是 “从前到后”,先求第 1 项,再基于第 1 项求第 2 项,依次类推直至求出第 n 项,通常使用循环语句实现,执行效率较高,不存在栈溢出问题,但对于某些复杂问题,代码逻辑可能不如递归清晰。在实际开发中,需根据具体问题的特点和需求,选择合适的实现方式。
课后实验性问题整理
问题描述:CalculateN 示例程序中,当 n 值较大时,阶乘数出现负数,分析问题根源并使用 BigInteger 类解决处理大整数的问题。
问题根源:Java 中 int 类型占 32 位,有固定的取值范围(Integer.MAX_VALUE=2³¹-1=2147483647,Integer.MIN_VALUE=-2³¹=-2147483648),当阶乘数超过 int 类型的最大值时,会发生数值溢出,计算机自动截断数值的二进制表示为 int 类型所能处理的最多位数,导致结果出现负数等错误情况。long 类型虽占 64 位,取值范围更大(Long.MAX_VALUE=2⁶³-1,Long.MIN_VALUE=-2⁶³),但对于更大的阶乘数,仍会出现溢出问题。

(二)浮点数比较相关
问题描述:分析代码 “double i = 0.0001; double j = 0.00010000000000000001; System.out.println (ij);” 输出 true 的原因,并掌握正确比较两个浮点数的方法。
原因分析:计算机不能精确地表达所有浮点数(特殊形式的浮点数除外),由于浮点数在计算机中以二进制形式存储,对于某些十进制小数,无法用有限位数的二进制精确表示,会存在微小的精度误差。在上述代码中,0.0001 和 0.00010000000000000001 在计算机中的二进制存储形式差异极小,超出了 double 类型的精度范围,因此使用 “
” 比较时,会认为两者相等,输出 true。
正确比较方法:当需要比较两个浮点数是否相等时,不应直接使用 “==” 运算符,而是比较它们差值的绝对值是否小于一个允许的极小范围(如 1e-10)。若差值的绝对值小于该范围,则认为两个浮点数相等;否则不相等。例如:
java
运行
if (Math.abs(i - j) < 1e-10)
System.out.println("true");
else
System.out.println("false");

posted @ 2025-10-08 17:07  Zyk20060430  阅读(6)  评论(0)    收藏  举报