递归中返回数字集

时间:2010-11-04 14:15:05

标签: java arrays recursion

以下代码搜索多项式函数的一个零点。它使用递归技术:

    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;
    }

我想知道如何返回所有零点。我的想法是使用数组,但我不知道该怎么做。有什么想法吗?

我不允许使用除数组之外的任何其他内容(例如,不允许使用哈希表或集合)

5 个答案:

答案 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.

无论如何,要回答你的问题:

  1. 创建一个类型为Double的大小为4的数组。使用null表示数组插槽为空。由于您的函数是四次,因此最多有四个零。
  2. 将数组作为函数中的参数传递。
  3. 当您检测到零时,请使用零值填充数组中剩余的第一个空闲插槽。
  4. 没有提供实际的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;
 }