Resolución ejercicio clase 19
Yeps3nM opened this issue · comments
Hola! En una de las slides se propone el siguiente ejercicio : Escriba un algoritmo que multiplique dos números naturales (sin usar la
multiplicación).
Para resolverlo yo escribí lo siguiente:
input = x, y ∈ N.
output = z = x* y
- z := 0
- for i = 1 to x :
- z := z + y
- return z
Tengo dudas de
a) cómo se escribe el for (sintaxis)
b) si es que en pseudocodigo se usa el " in range" y si está correcto partir de 1 para simular esa expresión
c) cómo encontrar una propiedad invariante para demostrar la correctitud parcial. Debido a que en los apuntes de donde sale el ejemplo se usa un loop while y las variables que se definen son diferentes y no puedo comparar el resultado.
Gracias!
Hola!
a) No se le da mucha importancia a la sintaxis al momento de escribir pseudocódigo. El propósito de este es poder explicar código sin tener que preocuparse de la sintaxis, por lo que si haces for i in range
, for i = 1 to x
, o for i ∈ 1...x
, todo se considera correcto mientras se entienda bien. Mi recomendación personal sería que no uses la primera porque podría generar confusión con la inclusividad de los límites en el loop, pero si lo dejas bien explicado no hay problema.
b) ^
c) No hay un método mecánico general para encontrar un invariante en todos los algoritmos. Los usos de cada algoritmo son distintos, y los invariantes están muy relacionados con la función de cada algoritmo, por lo que casi siempre será distinto el método para encontrarlo. En general, una buena idea es pensar en una propiedad que tiene que cumplir el algoritmo cuando termina, y intentar pensarlo desde ahí. En este caso, necesitamos que cuando termine el loop, z = x*y
, por lo que podemos buscar por ahí; notemos que tras la z = i*y
- este es un invariante válido en este caso. Luego, podemos usarlo para decir que tras x
iteraciones tendremos que z = x*y
, que es lo que necesitabamos para que el algoritmo sea correcto.