Antes de pensar en cómo implementar esto en Python (o en cualquier otro idioma), veamos el pseudocódigo, que parece un plan bastante bueno para resolver el problema.
Supongo que una cosa a la que te puedes atascar es la forma en que el pseudocódigo hace referencia a las variables , como highy low. La forma de entender las variables es considerarlas ranuras para que los valores puedan almacenarse. En un momento dado, una variable tiene algún valor, como el número 5, o una referencia a un archivo abierto. Ese valor se puede invocar en cualquier momento mediante el uso de su nombre, o puede asignársele un nuevo valor, y el valor anterior se olvidará con el nuevo valor en su lugar.
El pseudocódigo hace referencia a tres variables, high, lowy tries. También le dice cuáles deberían ser sus valores iniciales. Después de que se haya ejecutado la segunda línea, esos valores se establecen en 1000, 1 y 1, respectivamente, pero adquieren nuevos valores a medida que el programa avanza.
Otra característica del pseudocódigo es un ciclo condicional y un análisis de caso de la entrada del usuario. Tu traducción del ciclo del pseudocódigo es incorrecta. En su caso, ha creado una nueva variable iy ha ordenado a su programa que ejecute el cuerpo del ciclo con cada valor de i entre 1 y 1000. Obviamente, esto no tiene mucho que ver con el pseudocódigo.
En cambio, lo que desea hacer es repetir el ciclo para siempre, hasta que alguna condición (que cambia en el cuerpo del ciclo) se vuelva falsa. En python, la whiledeclaración hace esto. Si está familiarizado con un ifenunciado, whiletiene el mismo aspecto, pero una vez que el cuerpo está listo, la condición se vuelve a evaluar y el cuerpo se ejecuta nuevamente si todavía es verdadero.
Finalmente, el análisis de casos en el cuerpo del ciclo requiere comparar algo con los valores esperados. Aunque algunos otros lenguajes tienen varias formas de expresar esto, en python solo tenemos if- elif- elsecláusulas.
Aparte de transformar el pseudocódigo en código de trabajo, probablemente sea útil entender qué está haciendo realmente el programa. La clave aquí está en la línea 4, donde el programa adivina el promedio de dos valores. después de eso, el programa actúa sobre qué tan bien funcionó la suposición.
En la primera ejecución del ciclo, con high1000 y low1, el promedio es 500 (en realidad, el promedio es 500.5, pero dado que estamos promediando números enteros, Python supone que queremos que el resultado de la división también sea un número entero ) Obviamente, esa conjetura tiene solo un 0.1% de posibilidades de estar en lo cierto, pero si es incorrecta, se espera que el usuario nos diga si fue demasiado alta o demasiado baja. De cualquier manera, esa respuesta elimina por completo el 50% de las posibles conjeturas.
Si, por ejemplo, el usuario estaba pensando en un número bajo, entonces cuando el programa supuso 500, el usuario le diría al programa que 500 era demasiado alto, y entonces el programa no tendría que adivinar que el número estaba en el rango de 501 a 1000. Eso puede ahorrar mucho trabajo a la computadora.
Para usar esa información, el programa realiza un seguimiento del rango de valores posibles que podría tener el número objetivo. Cuando el número adivinado es demasiado alto, el programa ajusta su límite superior hacia abajo, justo debajo de la suposición, y si la suposición es demasiado baja, el programa ajusta su límite inferior hacia arriba justo por encima de la suposición.
Cuando el programa adivine de nuevo, la conjetura está justo en el medio del rango posible, cortando el rango a la mitad nuevamente. El número de conjeturas posibles pasó de 1000 a 500 originales en una conjetura, a 250 en dos conjeturas. Si el programa tiene mala suerte, y no puede obtenerlo dos (lo cual es bastante probable), en el tercero, solo le quedan 125 números de los que preocuparse. Después de la cuarta suposición, solo 62 números permanecen dentro del rango. Esto continúa, y después de ocho conjeturas, solo quedan 3 números, y el programa intenta el número medio para su novena conjetura. Si eso resulta ser incorrecto, solo queda un número, ¡y el programa lo adivina!
Esta técnica de dividir un rango por la mitad y luego continuar hasta la mitad más cercana se llama bisección y aparece en una amplia gama temas de interés para la informática.
¿Qué tal un CÓDIGO? Como no quiero privarte de la experiencia de aprendizaje, solo te daré algunos fragmentos que podrían ayudarte. Python es un lenguaje diseñado para la exploración interactiva, así que enciende tu intérprete y dale una oportunidad. Voy a publicar ejemplos con las indicaciones que se muestran, en realidad no mecanografiar eso.
Aquí hay un ejemplo usando la whilecláusula:
>>> x = 1000
>>> while x > 1:
... x = x/2
... print x
...
500
250
125
62
31
15
7
3
1
>>> x
1
La entrada de la consola del usuario se debe hacer a través de la raw_input()función. Simplemente devuelve lo que escribe el usuario. Esto es un poco más difícil de mostrar. Para simplificar las cosas, después de cada línea de python que requiera entrada, escribiré "Hello World!" (sin las comillas)
>>> raw_input()
Hello World!
'Hello World!'
>>> y = raw_input()
Hello World!
>>> print y
Hello World!
>>>
¿Qué tal una combinación de conceptos?
>>> 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
>>>
Oops. un pequeño error allí. ¡Mira si puedes arreglarlo!