2010-11-04 56 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]; 
}