gpt4 book ai didi

java - 二分查找函数未到达末尾

转载 作者:太空宇宙 更新时间:2023-11-04 10:02:18 25 4
gpt4 key购买 nike

import java.util.Scanner;

public class GuessingGame {

private Scanner reader;

public GuessingGame() {
// use only this scanner, othervise the tests do not work
this.reader = new Scanner(System.in);
}

public void play(int lowerLimit, int upperLimit) {
instructions(lowerLimit, upperLimit);
boolean isAboveAverage;
int counter = -1;

while (counter < howManyTimesHalvable(upperLimit - lowerLimit)) {
isAboveAverage = isGreaterThan(average(lowerLimit, upperLimit));
if (upperLimit == lowerLimit) {
break;
}
if (isAboveAverage) {
lowerLimit = average(lowerLimit, upperLimit);
} else {
upperLimit = average(lowerLimit, upperLimit);
}
counter++;
}

System.out.println("your number is " + upperLimit);
}

// implement here the methods isGreaterThan and average
public boolean isGreaterThan(int number) {
boolean isGreater = false;
boolean isCorrectAnswerGiven = false;

while (!isCorrectAnswerGiven) {
System.out.println("Is your number greater than " + (number) + "? (y/n)");
String answer = reader.nextLine();

if (answer.equals("yes") || answer.equals("y")) {
isGreater = true;
isCorrectAnswerGiven = true;
} else if (answer.equals("no") || answer.equals("n")) {
isCorrectAnswerGiven = true;
}
}

return isGreater;
}

public int average(int upperLimit, int lowerLimit) {
return (upperLimit + lowerLimit) / 2;
}

public int average2(int firstNumber, int secondNumber) {
double res = (firstNumber + secondNumber) / 2.0;
Math.round(res);
//System.out.println(res);
return (int) res;
}

public void instructions(int lowerLimit, int upperLimit) {
int maxQuestions = howManyTimesHalvable(upperLimit - lowerLimit);

System.out.println("Think of a number between " + lowerLimit + "..." + upperLimit + ".");

System.out.println("I promise you that I can guess the number you are thinking with " + maxQuestions + " questions.");
System.out.println("");
System.out.println("Next I'll present you a series of questions. Answer them honestly.");
System.out.println("");
}

// a helper method:
public static int howManyTimesHalvable(int number) {
// we create a base two logarithm of the given value

// Below we swap the base number to base two logarithms!
return (int) (Math.log(number) / Math.log(2)) + 1;
}
}

我在调试此代码时遇到问题。在这个类中,我应该实现一个简单的人工智能,它根据你对问题“你的数字是否大于”+一个数字的回答来猜测一个数字。我的问题是a.代码永远不会到达给定范围的末尾(因此,范围从 1 到 10,它永远不会猜测 1 或 10)和 b。是没有及时停止。 Java经常多次重复一个问题,但是程序应该在知道答案后立即说出答案。

我的错误显然在于游戏方法(为了完整性我包括了整个类(class)),我只是不知道在哪里。我的程序可以正常运行,因此不太可能出现拼写错误或编程错误。我的逻辑一定做错了什么,但我不知道是什么。有谁知道错误出在哪里吗?

最佳答案

你的逻辑有问题:

  • 您在每次迭代中计算howManyTimesHalvable。考虑到计数器的增量,这是没有意义的。它的最后一个可能值始终为 1,该值可能远低于当前计数器
  • 您在提出问题后立即检查上限和下限是否相同,而不更新这些值。只需将其移动到循环末尾即可。
  • 最后一件事是,在更新 lowerLimit 时,您需要将平均值增加 1。如果“您的数字是否大于 X”的答案为"is",则新的 lowerLimit 不能是 X

更正方法:

public void play(int lowerLimit, int upperLimit) {
instructions(lowerLimit, upperLimit);
boolean isAboveAverage;
int counter = howManyTimesHalvable(upperLimit - lowerLimit);
while (counter > 0) {
isAboveAverage = isGreaterThan(average(lowerLimit, upperLimit));
if (isAboveAverage) {
lowerLimit = average(lowerLimit, upperLimit)+1;
} else {
upperLimit = average(lowerLimit, upperLimit);
}
if (upperLimit == lowerLimit) {
break;
}
counter--;
}
System.out.println("your number is " + upperLimit);
}

关于java - 二分查找函数未到达末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53339816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com