如何将带精度控制的迭代立方根算法改为Java 8 Streams实现
实现思路
原算法是典型的二分迭代逻辑,我们可以通过Java 8 Stream的Stream.iterate生成无限迭代流,模拟二分的边界调整过程,筛选符合终止条件的结果即可完全对齐原有逻辑。
代码实现
import java.util.stream.Stream; public class CubeRootUtil { public static double calcCubeRoot(double n, double e) { // 0值直接返回 if (n == 0) { return 0.0; } // 初始化二分边界,兼容正负输入 double start = n < 0 ? Math.min(-1, n) : 0; double end = n < 0 ? 0 : Math.max(1, n); double ePow3 = Math.pow(e, 3); return Stream.iterate(new double[]{start, end}, bounds -> { double mid = (bounds[0] + bounds[1]) / 2; double midPow3 = Math.pow(mid, 3); // 边界调整逻辑和原代码完全一致 if (midPow3 < n) { return new double[]{mid, bounds[1]}; } else { return new double[]{bounds[0], mid}; } }) // 提取每次迭代的mid值 .map(bounds -> (bounds[0] + bounds[1]) / 2) // 匹配原代码的终止条件 .filter(mid -> { double midPow3 = Math.pow(mid, 3); return Math.abs(n - midPow3) <= ePow3 || mid == 0; }) .findFirst() .orElse(0.0); } }
逻辑对齐说明
- 边界调整规则和原代码完全相同:mid三次方小于n时左边界移到mid,否则右边界移到mid
- 终止条件完全匹配:误差小于等于e的三次方时返回结果,mid为0时终止返回0
- 所有Math2.pow调用都替换为JDK自带的Math.pow实现,效果一致
内容的提问来源于stack exchange,提问作者Jesdeljim
相关产品推荐
相关产品推荐

