【问题标题】:binary search function does not reach the the end二分查找功能没有到达终点
【发布时间】:2019-04-19 18:11:09
【问题描述】:
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;
 }
}

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

我的错显然在于播放方法(为了完整起见,我包括了整个班级),我只是不知道在哪里。我的程序正常运行,因此不太可能出现拼写错误或编程错误。我必须在我的逻辑中做错了什么,但我不知道是什么。有人知道错误在哪里吗?

【问题讨论】:

    标签: java search binary


    【解决方案1】:

    你的逻辑有些问题:

    • 您在每次迭代中计算howManyTimesHalvable。考虑到counter 的增量,这没有任何意义。它的最后一个可能值始终是 1,它可能远低于当前的 counter
    • 您在提出问题后立即检查上限和下限是否相同,而不更新这些值。只需将其移至循环末尾即可。
    • 最后一件事是更新lowerLimit 时需要将平均值增加1。如果“你的号码是否大于X”的答案是肯定的,那么新的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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2018-06-07
      • 2016-09-26
      • 1970-01-01
      • 2019-10-02
      • 2021-05-13
      相关资源
      最近更新 更多