Давайте сымитируем игру «Угадайка» между двумя людьми. Для этого нужно написать программу, которая отгадывает загаданное целое число от 1 до 1000 включительно.
Пользователь (или тестирующая система) загадывает число и не сообщает его вашей программе.
Угадать число нужно не более, чем за 10 попыток.
На каждую попытку пользователь отвечает одной из фраз:
- Больше;
- Меньше;
- Угадал!
Данная задача проверяется интерактивно. Другими словами, пока вы не выведите своё число, система не предоставит вам данных.
Пример
Предположим, что было загадано число 123
Диалог вашей программы с пользователем/системой должен выглядеть так:
500
Меньше
250
Меньше
125
Меньше
63
Больше
94
Больше
109
Больше
117
Больше
121
Больше
123
Угадал!
Решение
В этой задаче мы знакомимся с алгоритмом бинарного (двоичного ) поиска.
Кратко суть алгоритма в следующем. Мы предполагаем число из середины интервала, если на говорят больше, мы называем число из середины правого, относительно нашего числа, интервала. Если число оказалось меньше – то из середины правого.
Повторяем этот процесс до тех пор, пока не найдем нужное число. Если алгоритм реализован правильно, то вам потребуется не более 10 попыток.
Приведено два решения задачи:
C использованием “дельты” – числа, отняв или прибавив которое можно получить следующую середину отрезка.
С использованием начала и конца отрезка.
Второе решение более распространено, первое выглядит более лаконично.
Обратите внимание, что во втором решении верхний диапазон сдвинут до 1001. Это нужно потому, что на последнем этапе при загаданном значении 1000 мы никогда не достигнем этого результата с помощью операции //, потому что (999 + 1000) // 2 всегда будет равно 999.
Посмотреть код
Решение
number = 500
delta = number // 2
print(number)
while (answer := input()) != 'Угадал!':
if answer == 'Меньше':
number = number - delta
if answer == 'Больше':
number = number + delta
if delta >= 2:
delta = (delta + 1) // 2
print(number)
Решение
begin, end = 1, 1001
ask = (begin + end) // 2
print(ask)
while (answer := input()) != 'Угадал!':
if answer == 'Меньше':
end = (begin + end) // 2
elif answer == 'Больше':
begin = (begin + end) // 2
ask = (begin + end) // 2
print(ask)
Очень сильно хотел решить через рекурсию
трудности возникли когда загадывалось число 1000, помог Ваш сайт, спасибо
def recursiv(string, low, hight):
q = (hight – low) // 2 + low
print(q)
s = input()
if s == ‘Угадал!’:
return
elif s == ‘Меньше’:
recursiv(s, low, q)
elif s == ‘Больше’:
if q == 999:
recursiv(s, q, hight + 1)
else:
recursiv(s, q, hight)
string = ”
low = 1
hight = 1001
recursiv(string, low, hight)
Первое решение не удовлетворяет требованию 10 попыток, например, для числа 751.
Спасибо, что обратили внимание.
Вы совершенно правы. Кроме того, там оказалась излишняя печать. Поправил.