Прежде чем подумать о том, как реализовать это в python (или любом другом языке), давайте взглянем на псевдокод, который выглядит как довольно хороший план для решения проблемы.
Я полагаю, что вы можете застрять в том, как псевдокод ссылается на переменные , такие как high
и low
. Способ понять переменные состоит в том, чтобы считать их слотами, в которых значения могут быть сохранены. В любой момент времени переменная имеет некоторое значение, например число 5, или ссылку на открытый файл. Это значение может быть вызвано в любое время с использованием его имени, или ему может быть присвоено новое значение путем присвоения ему, и старое значение будет забыто, а новое значение займет его место.
Псевдокод ссылается на три переменные, high
, low
и tries
. Он также сообщает вам, какими должны быть их начальные значения. После выполнения второй строки эти значения устанавливаются на 1000, 1 и 1 соответственно, но они принимают новые значения по мере выполнения программы.
Еще одна особенность псевдокода - это условный цикл и анализ случая ввода пользователя. Ваш перевод цикла псевдокода неверен. В вашем случае вы создали новую переменную i
и поручили вашей программе запускать тело цикла с каждым значением i от 1 до 1000. Очевидно, что это не имеет ничего общего с псевдокодом.
Вместо этого вы хотите сделать цикл навсегда, пока какое-либо условие (которое изменяется в теле цикла) не станет ложным. В python оператор while
делает это. Если вы знакомы с оператором if
, while
выглядит так же, но после того, как тело выполнено, условие переоценивается, и тело выполняется снова, если оно все еще истинно.
Наконец, анализ случая в теле цикла требует сравнения чего-либо с ожидаемыми значениями. Хотя в некоторых других языках есть несколько способов выразить это, в python у нас есть только предложения if
- elif
- else
.
Помимо преобразования псевдокода в рабочий код, вероятно, полезно понять, что на самом деле делает программа. Ключ здесь находится в строке 4, где программа угадывает среднее значение двух значений. после этого программа показывает, насколько хорошо это предположение сработало.
При первом запуске цикла с high
, содержащим 1000, и low
, содержащим 1, среднее значение составляет 500 (на самом деле среднее значение составляет 500,5, но, поскольку мы усредняем целые числа, Python догадывается, что мы хотим получить результат деления также должен быть целым числом). Очевидно, что это предположение имеет всего 0,1% шансов быть правым, но если оно неверно, пользователь должен сообщить нам, было ли оно слишком высоким или слишком низким. В любом случае, этот ответ полностью исключает 50% возможных предположений.
Если, например, пользователь думал о малом числе, то, когда программа угадала 500, пользователь скажет программе, что 500 слишком велико, и тогда программе никогда не придется угадывать, что число был в диапазоне от 501 до 1000. Это может сэкономить компьютеру много работы.
Чтобы использовать эту информацию, программа отслеживает диапазон возможных значений, которым может быть номер цели. Когда предполагаемое число слишком велико, программа корректирует свою верхнюю границу вниз, чуть ниже предположения, а если предположение было слишком низким, программа корректирует свою нижнюю границу вверх чуть выше предположения.
Когда программа угадывает снова, предположение находится в середине возможного диапазона, снова сокращая диапазон пополам. Количество возможных предположений изменилось с 1000 до 500 в одном предположении, до 250 в двух предположениях. Если программе выпала ужасная удача, и она не может получить два (что на самом деле весьма вероятно), то к третьему у нее остается только 125 чисел, о которых нужно беспокоиться. После четвертого предположения в диапазоне остаются только 62 числа. Это продолжается, и после восьми догадок остается только 3 числа, и программа пытается определить среднее число для своего девятого предположения. Если это окажется неправильным, останется только одно число, и программа угадает его!
Этот метод разделения диапазона пополам и последующего перехода к более близкой половине называется делением пополам и встречается в широком диапазоне тем, представляющих интерес для информатики.
Как насчет КОДА! Поскольку я не хочу лишать вас опыта обучения, я просто дам вам несколько фрагментов, которые могут помочь вам в этом. Python - это язык, разработанный для интерактивного изучения, так что запустите переводчика и сделайте это. Я буду публиковать примеры с показанными подсказками, на самом деле не печатайте это.
Вот пример использования предложения while
:
>>> x = 1000
>>> while x > 1:
... x = x/2
... print x
...
500
250
125
62
31
15
7
3
1
>>> x
1
Получение консольного ввода от пользователя должно выполняться с помощью функции raw_input()
. Он просто возвращает все, что пользователь вводит. Это немного сложнее показать. Чтобы упростить задачу, после каждой строки Python, требующей ввода, я наберу «Hello World!» (без кавычек)
>>> raw_input()
Hello World!
'Hello World!'
>>> y = raw_input()
Hello World!
>>> print y
Hello World!
>>>
Как насчет сочетания понятий!
>>> myvar = ''
>>> while myvar != 'exit':
... myvar = raw_input()
... if myvar == 'apples':
... print "I like apples"
... elif myvar == 'bananas':
... print "I don't like bananas"
... else:
... print "I've never eaten", myvar
...
apples
I like apples
mangoes
I've never eaten mangoes
bananas
I don't like bananas
exit
I've never eaten exit
>>>
К сожалению. немного ошибки там. Посмотрим, сможешь ли ты это исправить!