2010-11-04 37 views
2

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

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

数组是否需要排序? – Woot4Moo 2010-11-04 14:33:24

+0

否可能未排序 – 2010-11-04 14:40:59

+0

好的。我提供了以下对您有价值的步骤。 – Woot4Moo 2010-11-04 14:41:33

回答

1

首先,由于您的解决方案存在与your previous question相同的问题,因此您无法保证您的零点计算完全正确。不幸的是,这次你不能使用检查a和b具有相反符号的简单解决方案,因为对于任意多项式来说,零不一定意味着函数穿过y = 0线例如y = x^4。

总之,要回答你的问题:

  1. 创建Double类型的大小为4的数组。使用null表示数组插槽为空。由于你的函数是四次的,所以最多有四个零。
  2. 在函数中传递数组作为参数。
  3. 当您检测到一个零点时,使用零值填充数组中剩余的第一个空闲插槽。

没有提供实际的Java,因为这是作业。

+0

hm,so:double [] zeros = new double [3]?要保存一个双重的阵列插槽之一,我必须使用索引来指定插槽吗?我会在if(sin == 0)语句中执行此操作... – 2010-11-04 14:54:06

+0

是的,除了'new Double [4]',因为四次可以有四个零。 – JeremyP 2010-11-04 15:04:15

+0

索引0 1 2 3将是4个元素。在3你说填写第一个空闲插槽。这意味着我必须通过它的索引来处理这个插槽,我不能只是添加(零)。所以我该怎么做? – 2010-11-04 15:08:01

2

我会在收集传递,如一个HashSet你的功能,把所有你发现到它的数字。如你所说你只能使用数组,那么你就知道可以找到的最大零点数,大概是这样,创建一个这样大小的数组,然后将NaN分配给每个元素,然后传入该数组,然后传入该数组,它是每个函数调用的最大当前索引。您将需要返回数组的新大小作为结果,以便您始终知道已找到多少个数字。

+0

我更新了我的问题。我不允许使用除数组之外的任何其他内容。 – 2010-11-04 14:29:04

+0

啊,这是作业吗?您今后应该将问题标记为避免提供不同API /库的答案。 – BalusC 2010-11-04 14:30:16

+0

然后再做作业。 – JeremyP 2010-11-04 14:32:41

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

注意@ Woot4Moo所说的关于调整数组大小的内容,如果你不知道从开始的最终大小。 – pablosaraiva 2010-11-04 14:43:38

2

下面是一些解释,因为这是家庭作业:

1)我们需要创建您将使用存储零点数据类型的数组。我的猜测是双重的。
2)阵列将需要某种类型的起始大小的,可以说10为了讨论
3)在nullstelle方法起见,我们将一个元素添加到在step 1
4中创建的阵列)如果数组的大小为LIMIT -1我们将数组复制到一个新阵列,大小等于LIMIT * 2
5)我们现在返回这个数组。

如果需要排序,我们可以使用任何排序技术来决定。

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