2014-04-22 121 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,如果你的代码能够正常工作但是想改进它,这可能是有用的。