在用户输入范围1到100执行二进制搜索
问题描述:
我正在运行一个二进制搜索程序,如果值是正确的,它将用户输入字符'l'设置为低'h'高,'c'。我的第一个方法返回字符 我的中点方法只读取第一个字符输入。如果我从50开始按'h',中点正确地升高到75,但我无法让程序读取'l'并再次将值降低到50。该程序只读取用户输入的第一个字符,但我需要更新答案中的值。我的while循环是错误的还是我的决定陈述?谢谢。在用户输入范围1到100执行二进制搜索
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);
}
}
答
这里有一些错误。我会尽力回答每一个问题,但我可能会错过一些,如果我错过了一些,请突出显示一些问题。 让我们看到这个循环与唯一的评论更可读
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')
因此,上述条件可writen像
switch(answer){
case 'h':
break;
case 'l':
break;
case 'c':
break;
default:
}
获取输入
你需要让每个回路输入,所以更容易将做到这一点在循环的开始,刚过while
一行。更妙的是,直接在交换机,因为你并不真正需要输入后,如:
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
@reubs这根本没有循环。你只需在'if(answer =='h')'中调用'getUserresponseGuess'两次,给你一个循环的幻觉。但是当你有一个'return'语句时你不能循环。我编辑了一下,你可以在'Evaluate'和'Loop or not?'中看到问题 – AxelH