Форум сайта python.su
Добрый день, уважаемое сообщество.
Задача следующая: Человек загадывает число от 1 до 100, а компьютер его отгадывает, запрашивая после каждой попытки подсказку, больше загадываемое число, меньше или равно предлагаемому им значению. Я новичок в программировании вообще и на Питоне в частности. Это мой первый язык программирования, учусь по учебнику самостоятельно.
Так вот, предлагалось написать алгоритм решения этой задачи на псевдокоде, придумав максимально простой способ. Я подумал что оптимальным было бы создание цикла с делением на 2, то есть пополам верхнего предела, то есть числа 100. Но вот как это реализовать в реальном коде не очень то понимаю. Пробовал написать, не выходит. В принципе этого и не требуется, но хотелось бы все таки написать. Что делаю не так понять довольно трудно, с моими нынешними навыками это может быть просто даже пунктуационные ошибки
Был бы благодарен, если бы вы показали мне цикл такого плана, который корректировался бы посредством подсказок от пользователя со следующими значениями: “загаданное число больше”, “меньше” и "равно выводимому. Заранее спасибо за внимание к моему посту.
Отредактировано Hando84 (Дек. 11, 2012 15:25:19)
Офлайн
Офлайн
Спасибо, но к сожалению это не совсем то, мне нужно чтобы компьютер угадывал, а не пользователь! Так же спасибо тому, кто выложил код, но почему то потом его удалил. Там было как раз то, что нужно, практически, к сожалению правда отгадывая комп уходил за пределы 100 вверх а вниз опускался до дробных значений типо 0.019 .К сожалению не запомнил ник писавшего. Но все равно мне это помогло продвинуться.. Буду допиливать дальше
Отредактировано Hando84 (Дек. 11, 2012 18:46:09)
Офлайн
Из примера выше используйте input для ввода сначения.
Простейший “способ делением на 2”, как вы выразились, называется метод бисекции (смотри Википедию). Ниже далеко не оптимальный код для поиска на коротком отрезке.
total = 100
input_value = 36
output_value = 0
while output_value != input_value:
total = float(total/2)
if output_value > input_value:
output_value -= total
elif output_value < input_value:
output_value += total
print int(output_value)
Офлайн
Hando84поэтому и удалил
правда отгадывая комп уходил за пределы 100 вверх а вниз опускался до дробных значений типо 0.019
value = 50 lim_h = 100 lim_l = 0 while True: print('{}?'.format(value)) inp = int(input('1: <\n2: >\nany: = !!!\n')) if inp == 1: lim_h = value value = (lim_l + value) // 2 elif inp == 2: lim_l = value value = (lim_h + value) // 2 else: break
Офлайн
sergeekДля точного вычисления в таких случаях всех проще использовать round(x) с точность, напрмер, 0.001
Офлайн
max_num = 100 min_num = 0 x = 71 # загадал юзер. while 1: v = (max_num + min_num) // 2 # попытка угадать. if v > x: max_num = v - 1 elif v < x: min_num = v + 1 elif v == x: break
Офлайн
dimy44Этот способ не намного быстрее обычного перебора.
Офлайн
dimy44Она и есть для целых. Просто то, что ты предложил проще написать через for от 0 до 100, с тем же успехом. Т.е. чем x ближе к 0 тем большее число шагов поиска решения. Проблема именно в этом.
Чето подумал, что задача для целых…
Офлайн