递归数组不能正常工作

时间:2012-09-10 13:50:48

标签: java recursion sorting recursive-query

好的,所以我写了一些基本的代码来测试各种排序方法(目前只测试一种排序方法)并找到最有效的。为了使结果被认为是准确的,我计划在不同大小的阵列上多次运行测试。我不是一遍又一遍地手动运行相同的测试,而是试图创建一个递归函数,但到目前为止我所做的并不起作用(基本情况不太有效,它会永远持续下去)。有人可以请帮助我,以便我可以使用一种有效的递归方法多次运行测试吗?

旁注,我已经写了大约5种不同的排序方法(如下面显示的selectionSort),并且想知道是否有人对测试方法中旋转它们的最佳方法有任何想法,这样我就不必改变selectionTort to other else每次我想测试不同的排序方法。欢呼声。

public void testSorts(){

    int size = 100;
    if(size < 1000000){
        String[] data;
        long start;
        long time;

        UI.println("\n\n======Selection Sort=======\n");

        data = createArray(size);
        start = System.currentTimeMillis();
        selectionSort(data);
        time =  System.currentTimeMillis() - start;

        UI.printf("Number of items:  %,d\n", data.length);
        UI.printf("Sorted correcetly: %b\n", testSorted(data));
        UI.printf("Time taken:       %.2f s\n", time/1000.0);

        UI.println("\n=======DONE=========\n");

        size = size*10;
        testSorts();

    }

4 个答案:

答案 0 :(得分:0)

如果你传入&#34;尺寸&#34;你可以解决这个问题。 testSorts函数的参数。就像现在一样,你只是在自己内部调用相同的函数而没有任何改变,所以你将得到一个无限循环(实际上是一个堆栈溢出)。

作为一个更大的图片评论,我没有看到任何使用递归的理由。

答案 1 :(得分:0)

为什么不创建一个方法'test()',其中包含一个调用实际测试方法的for循环?你的for循环可以增加100,就像你'testSorts'方法一样。

for(int size = 0; size < 1000000; size += 100) {
  testSort(size);
}

答案 2 :(得分:0)

问题是你的变量size是方法的本地变量,所以当你增加大小然后再次调用testSorts时,会在递归范围内创建一个“new size”变量调用

要递归使用此功能,您必须:

public void testSorts(int size){

    if(size < 1000000){
        ....
        size = size*10;
        testSorts(size);
    }
}

但是,我会使用一个简单的循环来逐步增加一个数量级的大小:

for (int size = 100; size < 1000000; size = size * 10){
    String[] data;
    long start;
    long time;

    UI.println("\n\n======Selection Sort=======\n");

    data = createArray(size);
    start = System.currentTimeMillis();
    selectionSort(data);
    time =  System.currentTimeMillis() - start;

    UI.printf("Number of items:  %,d\n", data.length);
    UI.printf("Sorted correcetly: %b\n", testSorted(data));
    UI.printf("Time taken:       %.2f s\n", time/1000.0);

    UI.println("\n=======DONE=========\n");
}

答案 3 :(得分:0)

我同意其他回答者说这里不需要使用递归,@ Rein或多或少地建议我做什么。

关于“自动”尝试不同类型的排序,您可以:

  • 定义包含public String[] sort(String[] data)方法
  • 的界面
  • 使用实现排序接口的各种实现在测试类中填充List。
  • 在测试类中现有循环内部或外部的另一个循环迭代您委派搜索到的对象(取决于您是希望所有算法在一个大小上还是在一个算法顺序的所有大小)

这意味着您的搜索算法与“测试工具”类很好地分开。