IIC1253 / IIC1253-2024-1

103 stars 1 forks source link

Resolución ejercicio clase 19 #188

Open Yeps3nM opened 3 months ago

Yeps3nM commented 3 months ago

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

  1. z := 0
  2. for i = 1 to x :
  3. z := z + y
  4. 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!

c4ebt commented 3 months ago

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 $i$-ésima iteración del algoritmo, tenemos que 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.