2013-12-03 7 views
0

Итак, я кодирую эту программу, в которой пользователь думает о числе от 1 до 100, а затем компьютер (с 8 догадками макс.) Угадает это число в 100% случаев (при условии, что пользователь дает правильную информацию. пользователь просто говорит ли слишком высоко или слишком низко, то компьютер корректирует свою следующую догадку к тому, что он знает, что компьютеры в прошлом догадка логика похожа на этоКак поместить эту логику в код/​​математику?

  • Во-первых:.. «это больше, чем 50?» NO Так что это между 1 и 50.
  • Второе: «Это больше 25?» ДА. Так что это между 26 и 50.
  • В-третьих: «Это больше 38?» НЕТ. 38.
  • Четвертое: «Это больше 32?» НЕТ. Так что между 26 и 32.
  • В-пятых: «Это больше, чем 29?» NO. Так что между 26 и 29.
  • Шестой: «Это больше 27?» ДА. Так что это либо 28, либо 29.
  • Седьмое: «Это 28?» NO. Так что это 29.
  • Восьмой: «Это 29?» ДА.

Так как я думаю об этом есть у вас есть переменная х = 50, если это слишком высока, то вы разделите на 2 и х изменяется на 25, если 25 является слишком низким, то вы бы умножить на 1,5

Итак, вопрос в том, как на самом деле вы помещаете это в код. Мне просто нужны инструкции if, которые не полностью выписаны (цикл). Я не хочу писать 8 раз (что, я думаю, я мог бы сделать). Я могу сделать цикл. Мне просто нужны основы кода/математики.

Ответ: Это не домашнее задание на его проект, над которым я работаю (учиться самому). Это на Java. Theres больше кода, это всего лишь часть.

+0

C#, Java, псевдокод? ... –

+1

Честно говоря, это выглядит как домашнее задание. –

+0

мы могли бы сделать это за вас - и вы узнаете, что? –

ответ

1

Так как я думаю об этом есть у вас есть переменная х = 50, если это слишком высока, то вы разделите на 2 и х изменяется на 25, если 25 является слишком низким, то вы бы умножить на 1,5

Это будет работать нормально для начальной итерации, поскольку, если 50 слишком мало, умножение на 1,5 даст вам 75. Если оно слишком велико, то разделение на 2 даст вам 25. В обоих случаях вы переходите к средней точке нового диапазона.

Однако предположим, что ваш номер равен 99. После этого первого вопроса ваша новая средняя точка будет 75, и вы снова зададите вопрос. Так как 75 все еще слишком низко, вы умножаете его на 1,5 и заканчиваете примерно 112, что значительно превышает допустимый диапазон значений.


Что вам нужно сделать, это, а не простым умножением средней точки значения, выработать новую среднюю точку на основе размера текущего диапазона. Вы можете сохранить другую переменную с дельта-значением (которое добавляется или вычитается из текущей средней точки, чтобы получить новую среднюю точку), которая начинается с 25 и половин для каждой итерации.

Проще говоря, это приложение двоичного поиска (или измельчения). Но есть гораздо более простой способ, используя только высокие и низкие границы (с расчетной серединой) и отрегулируйте один этих границ на основе ответа пользователя.

В псевдо-коде, это было бы что-то вроде (немного изменен, чтобы получить ответы yes, more и less:

set low to 1    # starting range 
set high to 100 
set answer to 'more'  # force entry to loop 
until answer is 'yes': 
    if high is low:   # only one possibility left 
     say 'Aaah, it must be ', high 
     exit 

    mid = (high + low)/2 # choose midpoint and ask about it 
    say 'Is it ', mid 
    get answer 

    if answer is 'yes':  # if match, claim victory and exit 
     say "I got it." 
     exit 

    if answer is 'more': # otherwise adjust range depending on answer 
     low = mid + 1  # - must be greater than mid 
    else: 
     high = mid - 1  # - must be less that mid 

Это гораздо более простое решение, тот, который также предотвращает проблемы большинство начинающих найти при первом их бинарном поиске, который попадает в бесконечный цикл в конце, потому что (например) (28 + 29)/2 снова дает вам 28, что означает, что вы никогда не сможете изучить номер элемента 29. В приведенном выше псевдокоде факт о том, что новый диапазон исключает старую середину означает, что этого не может быть.


В качестве дополнения, вот в Python (2.7, Python 3, возможно, придется использовать input вместо raw_input) код, который реализует выше (достаточно близки, чтобы показать, почему я считаю Python конечной псевдокод языка):

import sys 

low = 1 
high = 100 
answer = "more" 
while answer != "yes": 
    if high == low: 
     print 'Aaah, it must be', high 
     sys.exit() 

    mid = (high + low)/2 
    print 'Is it', mid 
    answer = raw_input() 

    if answer == "yes": 
     print "I got it." 
     sys.exit() 

    if answer == "more": 
     low = mid + 1 
    else: 
     high = mid - 1 

Я не предоставлю то же самое в Java, так как (1) Я подозреваю, что это может быть классную и (2) вы будете стать лучшим разработчиком, если вы делаете это самостоятельно, классную или нет.

0

Логика: двоичный поиск. В Интернете есть много информации по этой теме. http://en.wikipedia.org/wiki/Binary_search_algorithm Если вы читаете это, вы поймете, почему 8 догадок достаточны для диапазона 100

реализации в Java-коде: Существует псевдо-код в ссылке выше и готовом к использованию кода Java в Интернете. Если вы хотите узнать, мой совет - реализовать его самостоятельно.

Смежные вопросы