2014-04-22 162 views
0

我想要得到五個數字的組合,其中總和等於20,其平均值等於某個指定值。如何將遞歸方法轉換爲java中的非遞歸

我的代碼是

package Others; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

public class RandomNumbers { 

/** 
* @param args 
*/ 
// Max average = 3.6 ///Min average=2.2 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    List<Integer> i = getNumbers(); 
} 

public static List<Integer> getNumbers() { 
    List<Integer> n = new ArrayList<Integer>(); 
    Random r = new Random(); 
    for (int i = 0; i < 5; i++) { 
     int rr = r.nextInt(10); 
     n.add(rr); 
    } 

    int sum = 0; 
    double average = 0; 
    for (int j = 0; j < n.size(); j++) { 
     sum += n.get(j); 
     average += ((j + 1) * n.get(j)); 
     System.out.println(n.get(j)); 
    } 
    System.out.println("Avearge:" + average/20); 
    if (sum == 20 && (average/20) == 2.1) { 
     getCombination(n); 
    } else { 
     getNumbers(); 
    } 
    return n; 
} 

public static void getCombination(List<Integer> n) { 
    int total = 0; 
    for (int i = 0; i < n.size(); i++) { 
     total += n.get(i); 
     if (n.get(i) == 0) { 
      getNumbers(); 
     } else { 
      System.out.println("Item: " + i + ":" + n.get(i)); 
     } 
    } 
    System.out.println("Total:" + total); 
} 
    } 

它是爲平均值做工精細,從2.2到3.6。當我們給未在2.2和3.6之間它給錯誤的

Exception in thread "main" java.lang.StackOverflowError 
at sun.nio.cs.SingleByte.withResult(Unknown Source) 
at sun.nio.cs.SingleByte.access$000(Unknown Source) 
at sun.nio.cs.SingleByte$Encoder.encodeArrayLoop(Unknown Source) 
at sun.nio.cs.SingleByte$Encoder.encodeLoop(Unknown Source)`package Others; 

我搜索的一些網站,其中有些建議是避免重複和使用iterators.But我在困惑如何等數使用迭代器重新開發這個程序。

這是需要我的項目。 任何幫助,將不勝感激。請幫幫我。

+0

你更喜歡使用遞歸嗎?如果您喜歡遞歸,則無需切換到迭代。只要刪除錯誤。開始寫幾個測試。 –

+1

如果「5」數字的總和是「20」,我們可以得到一個不等於「4」的平均值嗎? – arunmoezhi

+1

@arunmoezhi看起來他沒有找到數字列表的平均值,儘管他在帖子中說了什麼。也就是說,我不知道他究竟在稱「平均水平」。 – IllusiveBrian

回答

0

這不是將遞歸轉換爲迭代的通用答案。這只是解決你的代碼中的錯誤。

  1. 擺脫getCombination(),它沒有任何用處。如果重要的是不存在零,那麼至少應該調用類似「regenerateListIfThereAreAnyZeroes」的方法。或者只是改進生成邏輯(見第2點)。
  2. 創建一個方法generateListOfNumbers(),該方法生成一個總和爲20的列表。不需要使用五個完全隨機數並且希望;改進邏輯,使(例如)
    1. 第一個數字大多是隨機的(0到16,也許);
    2. 第二,第三和第四個數字加上現有總數後加起來就是(20 - existingTotal);
    3. 第五數目是任何需要的總到達20.
  3. 創建方法boolean isAverageInRange(double floor, double ceiling)其提供有趣邏輯你已經實現(平均+ =((J + 1)* N。 get(j));等)
  4. 將主要方法更改爲循環,調用generateListOfNumbers(),直到isAverageInRange()返回true。

作爲一個附加的練習,你可以創建方法decreaseAverage()increaseAverage()是修改現有的列表,而不是創建一個全新的一個,每次的。我敢打賭,這將是值得您的老師信貸的價值。

爲了將來的參考,還有另一個堆棧交換站點CodeReview,如果你的代碼能夠正常工作但是想改進它,這可能是有用的。