【发布时间】:2017-10-03 16:45:15
【问题描述】:
我正在尝试编写一个程序,当给定一个函数和一个高低值时,它会在高低之间找到零。我以二分搜索风格递归地编写了它。当我运行 JUnit 测试时,它会给我一个堆栈溢出错误,除非我给它基本情况。这是我正在使用的代码。 功能代码:
public class Function implements FunctionInterface{
public static double f(double x){
return x*x-4;
}
}
找零的代码:
public class NumericalAnalysis {
public double solveForZero(Function f, double low, double high) {
double h = high;
double l = low;
double mid = (h+l)/2;
double x = Function.f(mid);
if(x == 0.0) {
return mid;
}else if(x < 0.0){
l = mid;
return solveForZero(f, h, l);
}else if (x > 0.0){
h = mid;
return solveForZero(f, h, l);
}
return mid;
}
}
测试代码:
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.After;
import org.junit.AfterClass;
public class TestNumericalAnalysis{
private NumericalAnalysis myAnalyzer;
@Before
public void setUp(){
myAnalyzer = new NumericalAnalysis();
}
@Test
public void testSolveForZero(){
double ans = myAnalyzer.solveForZero(new Function(), 0.0, 100.0);
assertEquals(4.0, ans, 0.001);
}
}
我使用的函数是x*x-4,高是100.0,低是0.0。我希望我错过了一些非常简单的东西而没有看到它。
【问题讨论】:
-
欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。具体来说,您给定的代码仅定义了一个函数并退出。发布一个 full MCVE,并坚持几个调试 print 语句。
-
编辑提供所有代码
-
浮点数并不精确,在大多数情况下,您不会以这种方式找到零 - 最好让它找到“足够接近零”的东西。
-
换句话说:x == 0 永远不会满足。另见stackoverflow.com/questions/1088216/…
标签: java recursion junit stack-overflow