如何在java中将递归方法转换为非递归方法

时间:2014-04-22 03:47:20

标签: recursion

我试图得到五个数字的组合,其总和等于20,其平均值等于某个指定值。

我的代码是

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; 

我在一些网站上搜索过,其中一些建议避免递归并使用迭代器。但我很困惑如何使用迭代器重新开发这个程序。

这是我的项目所必需的。 任何帮助,将不胜感激。请帮我。

1 个答案:

答案 0 :(得分: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)); 等)< / LI>
  4. 将main方法更改为循环,调用generateListOfNumbers()直到isAverageInRange()返回true。
  5. 作为附加练习,您可以创建方法decreaseAverage()increaseAverage()来修改现有列表,而不是每次都创建一个全新的列表。我敢打赌,这对你的老师来说是值得的。“

    为了将来参考,如果您的代码正常运行但想要改进它,那么另一个Stack Exchange站点CodeReview可能会有用。