【问题标题】:performing binary search in range 1 to 100 with user input使用用户输入在 1 到 100 范围内执行二进制搜索
【发布时间】:2017-02-20 10:41:00
【问题描述】:

我正在运行一个二进制搜索程序,该程序将用户输入字符“l”用于低“h”用于高,如果值正确则使用“c”。我的第一个方法返回字符 我的中点方法只读取第一个字符输入。如果我从 50 开始并按“h”,则中点正确升高到 75,但我无法让程序读取“l”并将值再次降低到 50。该程序仅读取用户输入的第一个字符,但我需要更新答案中的值。我的 while 循环是错误的还是我的决策语句?谢谢你。

import java.util.Scanner;

public class PlayGuessingGame {
    public static char getUserresponseGuess(){  
        Scanner scan = new Scanner(System.in);
        char guesses = scan.next().charAt(0); 
        System.out.println("this is the user input " + guesses);
        return(guesses);
    }   

    public static int getMidpoint(int low, int high){ 
        int middle;
        //the midpoint is high + low divided by 2
        middle = (low + high)/ 2;

        System.out.println("is it " + middle);
        char answer =  getUserresponseGuess();

        System.out.println("this is the answer " + answer);

        //char get_input = getUserresponseGuess();
        //System.out.println("this is the output "+ get_input);
        while(low <= high){
            if(answer == 'h'){
                low = middle + 1; 
                System.out.println("this is low " + low);
                middle = (low + high)/2; 

                char new_answer = getUserresponseGuess();
                middle = (low + high)/2;
                System.out.println("is it" + middle);
                getUserresponseGuess();
            }
            //the number presented to the user is is too high, the midpoint is high -1
            else if(answer == 'l'){
                System.out.println("we're in the low portion");
                high = middle - 1;
                middle = (low + high) /2;
                System.out.print("is it " + middle);
                middle = (low + high) /2;
            }
            if(answer == 'c'){
                System.out.println("congrats!");
            }
            return(middle);
        }
        return(-1); 
    }

    public static void main(String[] args){         
        getMidpoint(1,100);
    }
}

【问题讨论】:

    标签: java search binary


    【解决方案1】:

    你这里有一些错误。我会尽力回答每一个问题,但我可能会错过一些,如果我错过了请突出显示一些。 让我们看看这个只有注释的循环更易读

    while(low <= high){
        if(answer == 'h'){
            //calculate higher
            //ask input #####
            //calculate higher
            //ask input #####
        } else if(answer == 'l'){
            //calculate lower
        }
        if(answer == 'c'){
            //Congrats
        }
        //end method
    }
    

    评估

    首先,您在if(answer == 'h') 中进行了太多操作。您正在计算两次中间,之间有一个新的输入询问。不应该这样做。

    这个想法是在每个循环中要求用户输入一次

    是否循环?

    由于循环中有return语句,没有任何条件,无论如何都会执行。所以你的循环只执行一次(这不是一个真正的循环)。以下语句将简单地停止循环并退出方法:

    return(middle);
    

    我认为这应该是在以前的条件下,仅当用户输入正确时才停止该方法:

    if(answer == 'c'){
         System.out.println("congrats!");
         return(middle);
    }
    

    开关

    你可以用开关代替这三个条件,这样会更干净,

    if (answer == 'h')
    else if (answer == 'l')
    else if (answer == 'c')
    

    所以上面的条件可以写成这样

    switch(answer){
        case 'h':
    
            break;
        case 'l':
    
            break;
        case 'c':
    
            break;
        default:
    
    }
    

    获取输入

    您需要在每个循环中获取输入,因此在循环开始时更容易做到这一点,就在while 行之后。更好的是,直接在 switch 中,因为您以后不需要输入,例如:

    switch(getUserresponseGuess()){
        ...
    }
    

    扫描仪

    好吧,你不应该每次都创建一个Scanner 的新实例,你在读取值的方法中正在做什么:

    public static char getUserresponseGuess(){  
        Scanner scan = new Scanner(System.in);
        char guesses = scan.next().charAt(0); 
        System.out.println("this is the user input " + guesses);
        return(guesses);
    }   
    

    scan设置为全局实例并实例化一次,这样可以降低数据泄露的风险。

    private static Scanner scan = new Scanner(System.in);
    public static char getUserresponseGuess(){  
        ....
    }
    

    【讨论】:

    • 我如何请求和接受每个输入?我不知道为什么它只在输入为“h”时才循环
    • @reubs 这根本不是循环的。您只需在if(answer == 'h') 中调用getUserresponseGuess 两次,给您一种循环的错觉。但是当你有 return 语句时你不能循环。我编辑了一下,你可以在EvaluateLoop or not ?看到问题
    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2022-06-13
    • 2012-01-27
    • 1970-01-01
    • 2018-12-18
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多