Taller 2 - Matematica - Discretas - G1 - T2

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 23

Taller 2 Matemáticas Discretas II

Presentado por:

Daniel Ricardo Forero Callejas - Cód.: 084950132020

Juan Diego Pórtela Lozano - Cód.: 084950232020

Aris Jerson Lozano Timote - Cód.: 084950192020

Rodrigo Andrés Vargas Villanueva - Cód.:084900752021

Universidad del Tolima

Matemáticas Discretas II

Ingeniería de Sistemas

2021
PREGUNTAS GENERADORAS

1. ¿Qué es un algoritmo?

Conjunto ordenado de operaciones sistemáticas que permite hacer un cálculo y hallar la

solución de un tipo de problemas.

2. Describa las siguientes propiedades que por lo general tiene un algoritmo: entrada,

salida, precisión, determinismo, carácter finito, corrección y generalidad.

● Entrada: representa todos los datos que necesita el algoritmo para ser procesados, es

la alimentación necesaria para que se puedan procesar los datos, pueden ser datos que

introduzca el usuario del algoritmo o bien que se obtengan de alguna otra fuente.

● Salida: Son los resultados que se desean obtener en la ejecución del algoritmo, cabe

mencionar que aquí debe obtenerse la o las respuestas que resuelvan la problemática

planteada para resolver mediante el algoritmo.

● Precisión: Hace referencia a que todas las acciones de un algoritmo deben estar bien

definidas, esto es, ninguna acción puede ser ambigua, sino que cada una de ellas sólo

se debe poder interpretar de una única manera.

● Determinismo: Los resultados intermedios de cada paso de ejecución son únicos y

están determinados sólo por las entradas y los resultados de los pasos anteriores.

● Carácter finito: El algoritmo termina; es decir, se detiene después de ejecutar un

número finito de instrucciones.

● Corrección: La salida producida por el algoritmo es correcta; es decir, el algoritmo

resuelve el problema sin errores.

● Generalidad: El algoritmo se aplica a un conjunto de entradas


3. ¿Qué es el seguimiento (o rastreo) de un algoritmo?

Es una prueba de escritorio que se realiza para detectar si existen errores.

4. ¿Cuáles son las ventajas del pseudocódigo sobre el texto común al escribir un

algoritmo?

1. Ocupan mucho menos espacio en el desarrollo del problema.

2. Permite representar de forma fácil operaciones repetitivas complejas.

3. Es más sencilla la tarea de pasar de pseudocódigo a un lenguaje de programación

formal.

4. Si se siguen las reglas de identación se puede observar claramente los niveles en la

estructura del programa.

5. En los procesos de aprendizaje de los alumnos de programación, éstos están más cerca

del paso siguiente (codificación en un lenguaje determinado, que los que se inician en

esto con la modalidad Diagramas de Flujo).

6. Mejora la claridad de la solución de un problema.

5. ¿Cómo se relacionan los algoritmos con las funciones del pseudocódigo

Dentro de las diferencias que existen entre ellos, podemos destacar que el pseudocódigo es la

sintaxis que define el cómo resolver un problema, mientras que el algoritmo viene siendo la

representación semántica de este.

6. ¿A qué se refiere el “análisis del algoritmo”?

El análisis de algoritmos es una parte importante de la Teoría de complejidad computacional,

que provee estimaciones teóricas para los recursos que necesita cualquier algoritmo que

resuelva un problema computacional dado. Estas estimaciones resultan ser bastante útiles en

la búsqueda de algoritmos eficientes.


7. ¿Cuál es el tiempo del peor caso de un algoritmo?

Se refiere a la situación inicial de los datos que genera una ejecución del algoritmo con una

complejidad computacional mayor.

8. ¿Qué es el tiempo del mejor caso de un algoritmo?

Se refiere a la situación inicial de los datos que genera una ejecución del algoritmo con una

menor complejidad computacional.

9. ¿Qué es el tiempo del caso promedio de un algoritmo?

La situación inicial de los datos no sigue ningún patrón preestablecido que aporte ventajas o

desventajas. Se puede considerar, por tanto, la situación típica de ejecución del algoritmo.

10. Defina f (n) = O(g(n)). ¿Cómo se llama esta notación?

La notación-O (big o), sirve para dar una cota superior para el crecimiento de nuestro

algoritmo, esta afirma que hay un punto n0, tal que para los valores n después de este punto,

el valor múltiplo de la función g(n) supera o está en el mismo orden que nuestro algoritmo

f(n), es decir que: Existe un c y un n tal que 0 < f(n) < cg(n) para todo n0 < n.

Y lo representamos como: f(n) = O(g(n)). Matemáticamente podemos acotar f(n) con un

orden muy superior, pero no hacemos eso, porque queremos saber cuanto tardara nuestro

algoritmo con el cálculo más justo que podamos. se llama notación O grande.

11. Dé una interpretación intuitiva de cómo se relacionan f y g si f (n) = O(g(n)).

Todo lo que se concluye es que, excepto por un factor constante y un número finito de

excepciones, f está acotada arriba por g, de manera que g crece al menos tan rápido como f.
Existe un c y un n que 0 ≤ f(n) ≤ cg(n) para todo n0 ≤ n. Y lo representamos como: f (n) =

O(g(n)).

12. Defina f (n) = Ω(g(n)). ¿Cómo se llama esta notación?

La notaciòn -Ω (notaciòn omega), sirve para dar una cota inferior para el crecimiento de

nuestro algoritmo, esta afirma que hay un punto n0, tal que para los valores n después de este

punto, el valor múltiplo de la función g(n) está en un orden inferior o está en el mismo orden

que nuestro algoritmo f(n).

13. Dé una interpretación intuitiva de cómo se relacionan f y g si f (n) = Ω(g(n)).

Si, excepto por un factor constante y un número finito de excepciones, f está acotada por

abajo por g. También se dice que g es una cota inferior asintótica para f.

Existe un c y un n tal que 0 ≤cg (n) ≤ f(n) para todo n0 ≤n. y lo representamos como:

f (n) = Ω(g(n)).

14. Defina f (n) =Θ(g(n)). ¿Cómo se llama esta notación?

La notación-Θ(notación theta), sirve para dar una cota superior e inferior para el crecimiento

de nuestro algoritmo, esta afirma que hay un punto n0, tal que para los valores n después de

este punto, un valor múltiplo de la función g(n) está en el mismo orden que nuestro algoritmo

f(n), es decir que: Existe un c1, c2 y un que 0 ≤ c1g(n) ≤f(n) ≤ c2g(n) para todo n0 ≤n. y lo

representamos como: f (n) =Θ(g(n)).


15. Dé una interpretación intuitiva de cómo se relacionan f y g si f (n) = Θ(g(n)).

Todo lo que se concluye es que, excepto por un factor constante y un número finito de

excepciones, f está acotada arriba por g, de manera que g crece al menos tan rápido como f.

Existe un c1, c2 y un n tal que 0 ≤ c1g(n) ≤f(n) ≤ c2g(n) para todo n0 ≤n. y lo representamos

como: f (n) =Θ(g(n)).

16. ¿Qué es un algoritmo recursivo?

Un algoritmo recursivo es una llamada de una función desde la misma función, son

recursivos aquellos algoritmos que están dentro de ellos mismos son llamados una y otra vez.

Los algoritmos recursivos se basan en la metodología de llamar repetidamente la propia

función en que están definidos, y son de gran utilidad en multitud de campos en la

informática.

Al finalizar el estudio de estas lecciones seremos capaz de:

● Conocer los fundamentos y características de los algoritmos recursivos.

● Conocer el funcionamiento de las funciones recursivas.

● Conocer las características fundamentales de las estructuras de datos recursivas.

● Conocer las ventajas y desventajas de las funciones recursivas frente a las funciones

iterativas.

17. ¿Qué es una función recursiva?

Las funciones recursivas son funciones que se llaman a sí mismas durante su propia

ejecución. Ellas funcionan de forma similar a las iteraciones, pero debe encargarse de
planificar el momento en que dejan de llamarse a sí mismas o tendrá una función recursiva

infinita.

Estas funciones se estilan utilizar para dividir una tarea en subtareas más simples de forma

que sea más fácil abordar el problema y solucionarlo.

18. Dé un ejemplo de una función recursiva.

Un ejemplo de una función recursiva sin retorno, es el ejemplo de cuenta regresiva hasta cero

a partir de un número:

def cuenta_regresiva(número):

número -= 1

if numero > 0:

print numero

cuenta_regresiva(número)

else:

print "Boooooooom!"

print "Fin de la función", número

cuenta_regresiva (5)

2
1

Boooooooom!

Fin de la función 0

Fin de la función 1

Fin de la función 2

Fin de la función 3

Fin de la función 4

19. ¿Cuál es la base de una función recursiva?

Se dice que una función es recursiva cuando el cuerpo de la función utiliza a la propia

función.

Las definiciones recursivas funcionan siempre y cuando las llamadas recursivas se realicen de

forma que en algún momento se lleguen a los casos base.

Una función es recursiva final cuando tras la llamada recursiva no hay que realizar ningún

cómputo adicional. Es decir, el valor devuelto en la llamada recursiva es igual al valor que

debe devolver la función.

20. ¿Por qué toda función recursiva debe tener un caso base?

Siempre se debe avanzar hacia un caso base: Las llamadas recursivas simplifican el problema

y, en última instancia, los casos base nos sirven para obtener la solución. Aspectos que hay

que considerar al decidir cómo implementar la solución a un problema (de forma iterativa o

de forma recursiva)
EJERCICIOS PROPUESTOS:

1. Consulte en el directorio telefónico las instrucciones para llamar de larga distancia.


¿Qué propiedades de un algoritmo (entrada, salida, precisión, determinismo, carácter
finito, corrección, generalidad) están presentes? ¿Qué propiedades faltan?

Entrada de datos con los números de teléfono, Código de país, ciudad, etc

Salida deseada al escuchar el tono de llamada y la llamada entrante u Conexión al número


ingresado.

Precisión al digitar los números en el momento que se nos piden,carácter, determinismo a un


número marcado sale una llamada, finito en cuanto terminamos la conversación o entra el
tono termina el procedimiento, generalidad solo para un proceso específico.

● Entrada: Los números digitados(código de país, ciudad, números)


● Salida: Conexión al número ingresado.
● Precisión: Los pasos deben ser precisos sino no otorgara el resultado esperado.
● Determinismo: A un número marcado sale una llamada.
● Carácter finito: Son unos cuantos pasos para completar el algoritmo.
● Corrección: La llamada debe ser con el numero ingresado Faltaría la generalidad,
esta no cumple ya que las llamadas solo se completan cuando se marca un número
que se encuentra registrado.

2. La conjetura de GoldBach establece que todo número par mayor que 2 es la suma de
dos números primos. El siguiente es un algoritmo propuesto para verificar si la
conjetura de Gold Bach es verdadera:

a. Sea n = 4. b. Si n no es la suma de dos primos, la salida es “no” y se detiene.

c. De otra manera, se aumenta n en 2 y se sigue al paso 2.

d. La salida es “sí” y se detiene.

4. La salida es “sí” y se detiene.

¿Qué propiedades de un algoritmo (entrada, salida, precisión, determinismo, carácter


finito, corrección, generalidad) tiene este algoritmo propuesto? ¿Depende alguna de
ellas de la verdad de la conjetura de Gold Bach (que todavía no resuelven los
matemáticos)?

Entrada de datos al incrementar el número inicial de 2 en 2, salida no tiene pues no se


almacena en algún punto, no tiene precisión pues no necesariamente se cumple el postulado
al faltar un punto donde se identifique si es primo o no lo es, determinismo si tiene en los
valores intermedios obtenidos, carácter finito no cuenta pues la serie numérica es infinita.
3. Escriba un algoritmo que encuentre el elemento menor entre a, b y c.

leer a,b,c

if a<b and a<c:

print a

if c<b and c<a:

print c

if b<a and b<c:

print b

4. Escriba un algoritmo que encuentre el segundo elemento más pequeño entre a, b y c.


Suponga que los valores de a, b y c son diferentes.

package punto4;

import java.util.Scanner;

public class Punto4 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int a = 0, b = 0, c = 0;

boolean condition = true;

while (condition == true) {

try{

System.out.println("Algoritmo para encontrar el segundo elemento más pequeño.


Ingrese por favor el valor de a.");

a = Integer.parseInt(sc.next());

System.out.println("Ingrese por favor el valor de b.");

b = Integer.parseInt(sc.next());

System.out.println("Ingrese por favor el valor de c.");


c = Integer.parseInt(sc.next());

condition = false;

}catch(Exception e){

System.out.println("No ha ingresado un número en una de las variables pedidas o


está fuera de rango.");

continue;

}if(a==b || a==c || b == c){

System.out.println("Ha ingresado números iguales dentro de las variables, ejecutelo


nuevamente y corrija.");

}else if(a>b && a<c){

System.out.println("El segundo elemento más pequeño fue: " + a);

}else if(b>a && b<c){

System.out.println("El segundo elemento más pequeño fue: " + b);

}else{

System.out.println("El segundo elemento más pequeño fue: " + c);

5. Escriba un algoritmo que regrese el valor más pequeño en la sucesión S_1 ,


……,S_n

package test;

import java.util.Scanner;

public class Test {

public static void main(String[] args) {

String cadena;

int numeros, numeros2 = 0;


String revision1 = "S";

String revision2 = "_";

Scanner in = new Scanner(System.in);

int ingreso = 1;

while (ingreso == 1){

int i=0;

System.out.println("introduzca la cantidad de strings comenzando con 'S_' que


quiera ingresar, al final aparecerá el más pequeño.");

cadena = in.next();

String pre = String.valueOf(cadena.charAt(0));

String pre2 = String.valueOf(cadena.charAt(1));

if(revision1.equals(pre) && revision2.equals(pre2) && cadena.length() >= 3){

try{

numeros = Integer.parseInt(cadena.substring(2));

if(i==0){

numeros2 = numeros;

i=i+1;

}else{

if(numeros2<numeros){

numeros2 = numeros;

}catch(Exception e){

System.out.println(e + "no ha introducido números despues de la secuencia


de 'S_'");

}else{
System.out.println("No ha ingresado correctamente los datos como se pedían,
por favor ingrese los caracteres 'S_' seguido de su número deseado");

System.out.println("digite el número '1' si quiere introducir otro dígito, de lo


contrario digite cualquier otro número si quiere salir.");

try {

int ingreso1 = in.nextInt();

ingreso = ingreso1;

}catch(Exception q){

System.out.println("No ha ingresado un número");

if(numeros2 ==0){

System.out.println("No ha ingresado nada en la secuencia.");

}else{

System.out.println("el valor mínimos registrado por el usuario es: " + numeros2);

6. Escriba un algoritmo que regrese el valor más grande y el segundo elemento más
grande en la sucesión S_1 ,……S_n. Suponga que n > 1 y que los valores de la
sucesión son diferentes.

package punto6;

import java.util.Scanner;

public class Punto6 {

public static void main(String[] args) {

String cadena;

int numeros, numeros2 = 0, numeros3 = 0;

String revision1 = "S";


String revision2 = "_";

String pre ="", pre2="";

Scanner sc = new Scanner(System.in);

int ingreso = 1;

int i=0;

while (ingreso == 1){

System.out.println("introduzca la cantidad de strings comenzando con 'S_'


que quiera ingresar, el resultado más grande y el segundo más grande.");

cadena = sc.next();

if (cadena.length()>1){

pre = String.valueOf(cadena.charAt(0));

pre2 = String.valueOf(cadena.charAt(1));

}else{

System.out.println("Ingrese más de 2 caracteres, recuerde que para


comparar los números mayores se realizará primero con los caracteres iniciales
'S_'");

continue;

if(revision1.equals(pre) && revision2.equals(pre2) && cadena.length() >= 3)


{

try{

numeros = Integer.parseInt(cadena.substring(2));

if(i==0){

numeros2 = numeros;

i=i+1;

}else if(i==1){

if(numeros2 < numeros){

numeros3 = numeros;
i=i+1;

}else if(numeros2 > numeros && numeros2 != numeros){

numeros3 = numeros2;

numeros2= numeros;

i=i+1;

}else{

System.out.println("Ha ingresado un valor identico a los que están


almacenados en los resultados más grandes.");

}else if (i>1){

if(numeros>numeros2 && numeros>numeros3){

numeros2 = numeros3;

numeros3 = numeros;

}else if(numeros>=numeros2 && numeros < numeros3){

numeros2= numeros;

}else{

System.out.println("Ha ingresado un valor identico a los que están


almacenados en los resultados más grandes.");

}catch(Exception e){

System.out.println(e + "no ha introducido números despues de la


secuencia de 'S_'");

}else{

System.out.println("No ha ingresado correctamente los datos como se


pedian, por favor ingrese los caracteres 'S_' seguido de su número deseado");

}
System.out.println("digite el número '1' si quiere introducir otro digito, de lo
contrario digite cualquier otro número si quiere salir.");

try {

int ingreso1 = sc.nextInt();

ingreso = ingreso1;

}catch(Exception q){

System.out.println("No ha ingresado un número");

if(numeros2 ==0 || numeros3 == 0){

System.out.println("No ha ingresado al menos 2 dígitos en la secuencia.");

}else{

System.out.println("el valor más grande registrado es: " + numeros3 + " y el


segundo valor más grande registrado fue: "+ numeros2);

7. Escriba un algoritmo que regrese el valor más pequeño y el segundo elemento más
pequeño en la sucesión S_1 ,……S_n Suponga que n > 1 y que los valores de la sucesión
son.

package punto7;

import java.util.Scanner;

public class Punto7 {

public static void main(String[] args) {

String cadena;

int numeros, numeros2 = 0, numeros3 = 0;

String revision1 = "S";

String revision2 = "_";


String pre ="", pre2="";

Scanner sc = new Scanner(System.in);

int ingreso = 1;

int i=0;

while (ingreso == 1){

System.out.println("introduzca la cantidad de strings comenzando con 'S_' que


quiera ingresar, el resultado más pequeño y el segundo más pequeño.");

cadena = sc.next();

if (cadena.length()>1){

pre = String.valueOf(cadena.charAt(0));

pre2 = String.valueOf(cadena.charAt(1));

}else{

System.out.println("Ingrese más de 2 caracteres, recuerde que para comparar


los números mayores se realizará primero con los caracteres iniciales 'S_'");

continue;

if(revision1.equals(pre) && revision2.equals(pre2) && cadena.length() >= 3){

try{

numeros = Integer.parseInt(cadena.substring(2));

if(i==0){

numeros2 = numeros;

i=i+1;

}else if(i==1){

if(numeros < numeros2){

numeros3 = numeros;

i=i+1;

}else if(numeros > numeros2 && numeros != numeros2){


numeros3 = numeros2;

numeros2= numeros;

i=i+1;

}else{

System.out.println("Ha ingresado un valor idéntico a los que están


almacenados en los resultados más pequeños.");

}else if (i>1){

if(numeros<numeros2 && numeros<numeros3){

numeros2 = numeros3;

numeros3 = numeros;

}else if(numeros<=numeros2 && numeros > numeros3){

numeros2= numeros;

}else{

System.out.println("Ha ingresado un valor idéntico a los que están


almacenados en los resultados más pequeños.");

}catch(Exception e){

System.out.println(e + "no ha introducido números despues de la secuencia


de 'S_'");

}else{

System.out.println("No ha ingresado correctamente los datos como se pedian,


por favor ingrese los caracteres 'S_' seguido de su número deseado");

System.out.println("digite el número '1' si quiere introducir otro digito, de lo


contrario digite cualquier otro número si quiere salir.");

try {
int ingreso1 = sc.nextInt();

ingreso = ingreso1;

}catch(Exception q){

System.out.println("No ha ingresado un número");

if(numeros2 ==0 && numeros3 == 0){

System.out.println("No ha ingresado al menos 2 dígitos en la secuencia.");

}else{

System.out.println("el valor más pequeño registrado es: " + numeros3 + " y el


segundo valor más pequeño registrado fue: "+ numeros2);

8. Comprueba si se ejecuta el siguiente algoritmo.

Busca el número mayor y devuelve el valor:

package javaapplication1;

import java.util.Scanner;

public class busca_mayor {

public static void main(String[] args) {

Scanner kb= new Scanner(System.in);

System.out.println("Escriba un valor");

int val1 = kb.nextInt();

System.out.println("Escriba un valor");

int val2 = kb.nextInt();

System.out.println("Escriba un valor");
int val3 = kb.nextInt();

int mayor=val1;

if (mayor<val2)

mayor=val2;

if(mayor<val3)

mayor=val3;

System.out.println("El mayor es: "+ mayor);

R/ si se ejecuta correctamente este algoritmo.

9. Devuelve el número más alto en una sucesión:

package javaapplication1;

import java.util.Scanner;

public class max_sucesion {

public static void main(String[] args) {

Scanner kb= new Scanner(System.in);

System.out.println("Cuantos números desea comparar?: ");

int n = kb.nextInt();

System.out.println("Escriba un número: ");

int a = kb.nextInt();

int mayor=a;

for (int i=1; i<n; i++){

System.out.println("Escriba un número: ");

int b = kb.nextInt();

if(mayor<b)
mayor=b;

System.out.println("El mayor es: "+mayor);

R/ Si se ejecuta correctamente el código propuesto.

10. Devuelve el valor de los dos menores:

package javaapplication1;

import java.util.Scanner;

public class dos_menores {

public static void main(String[] args) {

Scanner kb= new Scanner(System.in);

System.out.println("Escriba un valor");

int val1 = kb.nextInt();

System.out.println("Escriba un valor");

int val2 = kb.nextInt();

System.out.println("Escriba un valor");

int val3 = kb.nextInt();

if (val1<val2){

if(val1<val3){

System.out.println("El menor es: "+val1);

if(val2<val3){

System.out.println("El segundo menor es: "+val2);

}else{
System.out.println("El segundo menor es: "+val3);

}else{

System.out.println("El menor es: "+val3);

if(val1<val2){

System.out.println("El segundo menor es: "+val1);

}else{

System.out.println("El segundo menor es: "+val2);

}else{

if(val2<val3){

System.out.println("El menor es: "+val2);

if(val1<val3){

System.out.println("El segundo menor es: "+val1);

}else{

System.out.println("El segundo menor es: "+val3);

}else{

System.out.println("El menor es: "+val3);

if(val1<val2){

System.out.println("El segundo menor es: "+val1);

}else{

System.out.println("El segundo menor es: "+val2);

}
}

R/ Funciona correctamente dicho programa

También podría gustarte