以下代码搜索多项式函数的一个零点。它使用递归技术:
private static double funktion(int[] koef, double x){
return koef[0] * Math.pow(x,4) + koef[1] * Math.pow(x,3) +
koef[2] * Math.pow(x,2) + koef[3]*x + koef[4];
}
private static double nullstelle(double a, double b, int[] koef){
double middle = (a + b)/2;
double result = middle;
if(Math.abs(a-b) > 0.00001){
double sin = funktion(koef, middle);
if(sin == 0){
result = middle;
}else if(Math.signum(funktion(koef, a)) ==
Math.signum(funktion(koef, middle))){
result = nullstelle(middle, b, koef);
}else{
result = nullstelle(a, middle, koef);
}
}
return result;
}
我想知道如何返回所有零点。我的想法是使用数组,但我不知道该怎么做。有什么想法吗?
我不允许使用除数组之外的任何其他内容(例如,不允许使用哈希表或集合)
答案 0 :(得分:2)
我会将诸如HashSet之类的集合传递给您的函数,并将您发现的所有数字放入其中。
正如你所说,你只能使用数组,那么你知道可以找到的零点的最大数量,大概是,创建一个这个大小的数组,为每个元素分配NaN,然后传入那个数组和每个函数调用的最大当前索引。您将需要返回数组的新大小,以便始终知道已找到多少个数字。
答案 1 :(得分:2)
以下是一些解释,因为这是作业:
1)我们需要创建一个用于存储零点的数据类型数组。我的猜测是双倍的
2)数组需要某种类型的起始大小,为了讨论,我们可以说10
3)在nullstelle
方法中,我们将向step 1
中创建的数组添加一个元素
4)如果数组的大小为LIMIT -1
,我们将数组复制到一个大小等于LIMIT * 2
的新数组中
5)我们现在返回这个数组。
如果需要进行排序,我们可以使用任何排序技术来查看列表。
答案 2 :(得分:1)
首先,您的解决方案遇到了与your previous question相同的问题之一,因为您不能保证您的零计算完全正确。不幸的是,这次你不能使用检查a和b具有相反符号的简单解决方案,因为对于任意多项式,零不需要暗示函数越过y = 0线,例如y = x ^ 4.
无论如何,要回答你的问题:
Double
的大小为4的数组。使用null表示数组插槽为空。由于您的函数是四次,因此最多有四个零。没有提供实际的Java,因为这是作业。
答案 3 :(得分:1)
Math.pow是一个非常昂贵的功能。您可以完全使用嵌套表达式来避免它。 (而且更短)
private static double funktion(int[] koef, double x){
return (((koef[0] * x + koef[1]) * x +
koef[2]) * x + koef[3]) * x + koef[4];
}
答案 4 :(得分:0)
public double[] returnOnlyZeros(int[] whatever1, double whatever2) {
double[] result = new double[/*put the size here*/];
// your math here
// put the values into the result array
return result;
}