当前位置: 首页 > 知识库问答 >
问题:

用Java8Streams实现迭代法到函数法的转换

华誉
2023-03-14
    while ((start + end) / 2 != 0) {
        Double mid = (start + end) / 2;
        if (Math2.pow(mid, 3) < n) {
            start = mid;
        } else if (Math.abs(n - Math2.pow(mid, 3)) > Math2.pow(e, 3)) {
            end = mid;
        } else if (Math.abs(n - Math2.pow(mid, 3)) < Math2.pow(e, 3)) {
            return mid;
        }
    }
    return 0.0;

}

共有1个答案

羿宏硕
2023-03-14

Java Stream API从Java9开始就有方法Stream::iterate,因此表示迭代步骤/状态的类可以如下实现:

java prettyprint-override">class CubeSolver {
    static final double EPS = 1E-06;
        
    private double start, end, n, mid;

    public CubeSolver(double s, double e, double n) {
        this.start = s;
        this.end = e;
        this.n = n;
        this.mid = (start + end) / 2;
    }

    // UnaryOperator<CubeSolver> for iteration
    public CubeSolver next() {
        if (done()) {
            return this;
        }
        if (Math.pow(mid, 3) < n) {
            start = mid;
        } else if (Math.abs(n - Math.pow(mid, 3)) > EPS) {
            end = mid;
        }
        return new CubeSolver(start, end, n);
    }
    
    // define end of calculation
    public boolean done() {
        return mid == 0 || Math.abs(n - Math.pow(mid, 3)) < EPS;
    }
    
    @Override
    public String toString() {
        return "root = " + mid;
    }
}

然后基于流的解决方案如下所示:

  1. 开始结束n
  2. 定义初始种子
  3. 使用stream::iteratehasnext谓词创建有限的流2a)或使用旧的stream::iterate不使用hasnext,但使用stream::takewhile操作有条件地限制流-自Java 9
  4. 以来也可用
  5. 使用stream::reduce获取流的最后一个元素
CubeSolver seed = new CubeSolver(1.8, 2.8, 8);
CubeSolver solution = Stream
    .iterate(seed, cs -> !cs.done(), CubeSolver::next)
    .reduce((first, last) -> last) // Optional<CubeSolver>
    .orElse(null);
    
System.out.println(solution); 

产出:

root = 2.0000002861022947

在Java11中,添加了静态谓词::NOT,因此使用TakeWhile的2A解决方案可以如下所示:

CubeSolver seed = new CubeSolver(0, 7, 125);
CubeSolver solution = Stream
    .iterate(seed, CubeSolver::next)
    .takeWhile(Predicate.not(CubeSolver::done))
    .reduce((first, last) -> last) // Optional<CubeSolver>
    .orElse(null);
    
System.out.println(solution); 

输出(对于EPS=1E-12):

root = 4.999999999999957
 类似资料:
  • 我正在尝试解决leetcode上的以下问题:硬币兑换2 输入:金额=5,硬币=[1,2,5]输出:4说明:有四种方法来弥补金额: 5=5 5=2 2 1 5=2 1 1 1 5=1 1 1 1 1 我试图实现一个迭代的解决方案,本质上模拟/模仿递归使用堆栈。我已经设法实现了它,解决方案有效,但它超过了时间限制。 我注意到递归解决方案利用记忆进行优化。我也想在我的迭代解决方案中包含这一点,但我不知道

  • 本文向大家介绍Python实现链表反转的方法分析【迭代法与递归法】,包括了Python实现链表反转的方法分析【迭代法与递归法】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现链表反转的方法。分享给大家供大家参考,具体如下: Python实现链表反转 链表反转(while迭代实现): 链表的反转引入一个cur_node变量,表示当前节点;同时需要引入一个变量new_link表

  • 合并和拆分迭代器 # itertools_chain.py from itertools import * for i in chain([1, 2, 3], ['a', 'b', 'c']): print(i, end=' ') print() # itertools_chain_from_iterable.py from itertools import * def make_

  • 牛顿函数现在起作用了,我想展示网格中的哪些初始点产生收敛到-1的牛顿迭代,收敛到(1 (3)^1/2)/2我,鉴于: f(x)=x^31 我创建了一个网格来显示bi的哪些初始点收敛到根。

  • 本文向大家介绍php实现转换ubb代码的方法,包括了php实现转换ubb代码的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php实现转换ubb代码的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的php程序设计有所帮助。

  • 本文向大家介绍Python实现迭代时使用索引的方法示例,包括了Python实现迭代时使用索引的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现迭代时使用索引的方法。分享给大家供大家参考,具体如下: 索引迭代 Python中,迭代永远是取出元素本身,而非元素的索引。 对于有序集合,元素确实是有索引的。有的时候,我们确实想在 for 循环中拿到索引,怎么办? 方法是使用