Найти - Пользователи
Полная версия: Нужна помощь с циклом
Начало » Центр помощи » Нужна помощь с циклом
1 2
Hando84
Добрый день, уважаемое сообщество.

Задача следующая: Человек загадывает число от 1 до 100, а компьютер его отгадывает, запрашивая после каждой попытки подсказку, больше загадываемое число, меньше или равно предлагаемому им значению. Я новичок в программировании вообще и на Питоне в частности. Это мой первый язык программирования, учусь по учебнику самостоятельно.

Так вот, предлагалось написать алгоритм решения этой задачи на псевдокоде, придумав максимально простой способ. Я подумал что оптимальным было бы создание цикла с делением на 2, то есть пополам верхнего предела, то есть числа 100. Но вот как это реализовать в реальном коде не очень то понимаю. Пробовал написать, не выходит. В принципе этого и не требуется, но хотелось бы все таки написать. Что делаю не так понять довольно трудно, с моими нынешними навыками это может быть просто даже пунктуационные ошибки

Был бы благодарен, если бы вы показали мне цикл такого плана, который корректировался бы посредством подсказок от пользователя со следующими значениями: “загаданное число больше”, “меньше” и "равно выводимому. Заранее спасибо за внимание к моему посту.
reclosedev
http://python.su/forum/topic/20165/
Hando84
Спасибо, но к сожалению это не совсем то, мне нужно чтобы компьютер угадывал, а не пользователь! Так же спасибо тому, кто выложил код, но почему то потом его удалил. Там было как раз то, что нужно, практически, к сожалению правда отгадывая комп уходил за пределы 100 вверх а вниз опускался до дробных значений типо 0.019 .К сожалению не запомнил ник писавшего. Но все равно мне это помогло продвинуться.. Буду допиливать дальше
dugar
Из примера выше используйте 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)

Как разберешься, спрашивай дальше.
sergeek
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
dugar
sergeek
Для точного вычисления в таких случаях всех проще использовать round(x) с точность, напрмер, 0.001
dimy44
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
dugar
dimy44
Этот способ не намного быстрее обычного перебора.
Представьте если потребуется угадать float 71.46, шаг итерации 0.01.
Сколько потребуется времени?
Хотя для поставленной задачи на отрезке 100, шаг 1 не столь критичен.
dimy44
Чето подумал, что задача для целых…
dugar
dimy44
Чето подумал, что задача для целых…
Она и есть для целых. Просто то, что ты предложил проще написать через for от 0 до 100, с тем же успехом. Т.е. чем x ближе к 0 тем большее число шагов поиска решения. Проблема именно в этом.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB