二进制搜索猜测数字递归

时间:2014-11-09 08:07:47

标签: java recursion binary-search

我正在编写一个二进制搜索算法,我想得到计数最小猜测是否需要搜索我提供的数字。假设我提供的数字是33,那么它应该计数7步。

Step no     number guessed   result     range of possible values
0                                                 1-100
1              50           too high              1-49
2              25           too low               26-49
3              37           too high              26-36 
4              31           too low               32-36
5              34           too high              32-33
6              32           too low               33-33
7              33           correct

所以这是我的代码

package binarySearch;

public class Binary {

    int gussedNo;
    public static   int count =0;

     void search(int lowerBound,int upperBound,int num){
        gussedNo=upperBound+lowerBound/2;
        count();
        if(gussedNo==num){
            System.out.println(count);}
            else if(gussedNo>num){

                upperBound=gussedNo-1;

                search(lowerBound,upperBound,num);

                }
            if(gussedNo<num){

                lowerBound=gussedNo+1;
                search(lowerBound,upperBound,num);




        }

        }
    int count(){
        count=count+1;
        return count;
    }

}

我创建了一个单独的方法。这是我的主要课程..

package binarySearch;

public class MainClass {
    public static void main (String[] args){

        Binary search= new Binary();

        search.search(1, 100,33 );

    }
}

这里我将lowerbound设为1,将uperbound设为100,我想要计算的数字为33。 但是当我执行代码时,我得到的计数为68 ..但根据二进制搜索它应该是7

2 个答案:

答案 0 :(得分:3)

看看你创建下一个猜测的行:

gussedNo=upperBound+lowerBound/2;

由于Java中的数学运算符优先级,此行与具有:

相同
gussedNo=upperBound+(lowerBound/2);

显然没有执行二进制搜索,因此,不是你想要的。您可以通过明确添加括号来解决此问题:

gussedNo = (upperBound + lowerBound) / 2;

答案 1 :(得分:1)

这是你的问题 gussedNo=upperBound+lowerBound/2;

你忘记了运营商的订单执行 它应该是 gussedNo=(upperBound+lowerBound)/2;