Java递归问题

时间:2009-11-25 11:29:26

标签: java recursion

在实现之前,我有一些代码要做一些测试。基本上在第二次递归调用时它应该在这一行输入(否则如果(sec> = 1){return test(s,lowerBounds + middle + 1,upperBounds);})但它不会改为继续其他如果和更改秒的值。我错过了什么吗?

public class Main
{
    private static String[] test = { "aaa", "aab", "aac", "aad", "aae" };

    public static void main( String[] args ) {
        System.out.println( test( "aab", 0, 4 ) );
    }

    public static int test( String s, int lowerBounds, int upperBounds ) {
        if( upperBounds < lowerBounds || upperBounds > lowerBounds ) {

            int middle = ( upperBounds – lowerBounds ) / 2;
            int sec = s.compareTo(test[lowerBounds + middle]);

            if( sec == 0 )
                { return lowerBounds + middle; }
            else if( sec <= -1 )
                { return test( s, lowerBounds, upperBounds – middle – 1 ); }
            else if( sec >= 1 )
                { return test( s ,lowerBounds + middle + 1, upperBounds ); }
        } else { return -1; }
        return -10;
    }
}
编辑:对不起,我应该说这是我自己实现的二进制搜索。我仍在学习自己的编程,所以如果我以某种方式搞砸了,请不要激怒我。

编辑:如果我删除第一个if语句,它看起来好像没问题?

2 个答案:

答案 0 :(得分:4)

这一行

if( upperBounds < lowerBounds || upperBounds > lowerBounds )

看起来很可疑。如果您的upperBounds低于lowerBounds,那么middle将为负数。通常,这应该仅在递归结束时发生(当您找到正确的元素时,或者当它不存在时)。如果删除这个if语句,这可能就是你的递归有效的原因(但是如果你严重调用函数,事情就会中断)。

另外,为什么要与test [lowerBounds + middle]进行比较?

int sec = s.compareTo(test[lowerBounds + middle]);

二进制排序的想法是计算边界的中间位置(如果有意义),并将中间的元素与您正在寻找的元素进行比较。

如果中间较大,(假设您的数组已排序),则必须查看“左侧”。如果if更低,则看起来“在右侧”。您的测试仅在第一次递归时起作用,因为lowerBounds为0。

希望这有帮助。

答案 1 :(得分:3)

if(upperBounds&lt; lowerBounds || upperBounds&gt; lowerBounds)

除了upperBounds == lowerBounds

的情况外,

对于每个数字都是正确的