UNIDAD CULHUACAN
Unidad de Aprendizaje:
Análisis de Algoritmos
Profesor:
Práctica 2:
Integrantes:
GRUPO: 5CM23
Objetivos:
Resolver los siguientes problemas:
Factorial
Serie Fibonacci
Con algoritmos
1. Recursión
2. Programación Estructurada (Utilizar funciones)
3. Iterativo (Utilizando ciclos, while, do while, for)
Introducción
Se pretende aplicar la MDAAC en cada uno de los algoritmos propuestos, para el
desarrollo de los mismos, utilizaremos la herramienta en software llamada PSeInt,
la cual nos permite desarrollar pseudocódigos, y además probarlos con una interfaz
amigable.
Desarrollo
Definición del problema 1: Resolver el problema de encontrar el factorial de un
número.
El factorial de un numero entero positivo “n” se define como el producto de todos los
números enteros positivos menores o iguales que n.
En otras palabras para poder sacar el factorial de un número n (n!) lo que debemos
hacer es multiplicar n por los números antecesores a este hasta llegar a 1.
Ejemplos:
8x7x6x5x4x3x2x1
8!=803220 =
1 -> se observa que 1 es el termino de
8!=8*7! = 8x7x6x5x4x3x2x1
parada (se usara como una condición)
7!=7*6! = 7x6x5x4x3x2x1
6!=6*5! = 6x5x4x3x2x1
5!=5*4! = 5x4x3x2x1
4!=4*3! = 4x3x2x1
3!=3*2! = 3x2x1
2!=2*1! = 2x1
1!=1 = 1x1
0!=1
ALGORITMO GENERAL
Inicio
Leer n;
para i<-n; hasta 1; (i<-i-1) hacer
fact<- i*i-1;
fin para
escribir “fac”;
fin
PRUEBA DE ESCRITORIO
# n i fac
1 3 3 6
2 2
1 0
El resultado nos da erróneo, así que se empiezan a hacer algunos ajustes en el
algoritmo.
DEPURACION DE ALGORITMO
Inicio
Leer n;
si no
n*<- i-1;
fin para
fin si
escribir “n”;
fin
PRUEBA DE ESCRITORIO
# n i
1 3 3
2 2
0
PRUEBA DE ESCRITORIO
# n i
1 3 3
2
1
6
Codificación
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int n,factorial, i;
puts("Ingrese un numero: ");
scanf("%i", &n); //& nos da (apunta) la direccion de memoria
if (n==1 |n==0 )
{
printf ("\n El factorial de %i es: 1",n);
}
else
{
factorial=n;
for(i=n;i>1;i--)
{
factorial=factorial*(i-1);/*factorial*=(i-1) */
}
printf("El factorial de %i es: %i\n",n,factorial);
}
return 0;
}
Funcion ped_dat
leer num
FinFuncion
Funcion cicl_fact
fact<-fact*i
i<-i+1
Fin Para
FinFuncion
Funcion cond_fact
Si num<0 Entonces
fact<-0
SiNo
Si num<-0 Entonces
fact<-1
SiNo
cicl_fact
Fin Si
Fin Si
FinFuncion
Algoritmo factorial
ped_dat
cond_fact
FinAlgoritmo
Prueba de Escritorio.
Sea num=5
Desde 1 hasta 5
1!=1
2!=1x2
3!=1x2x3
4!=1x2x3x4
5!=1x2x3x4x5
5!=720
Codificación
#include "iostream"
#include "conio.h"
using namespace std;
int i, fact=1, num;
void ped_dat(){
cout<<"ingrese un numero: ";
cin>>num;
}
void cicl_fact(){
for (i=1; i<=num; i++)
fact=fact*i;
}
void cond_fact(){
if (num<0){
fact=0;
}else{
if (num==0)
{
fact=1;
}else{
cicl_fact();
}
}
}
main(){
ped_dat(); cond_fact();
cout<<"El factorial de "<<num<<" es: "<<fact;
}
El tercer algoritmo es el Recursivo elaborado por Martin
FACTORIAL DE UN NÚMERO
El factorial de un entero no negativo n, se escribe n! (y se pronuncia “n factorial”),
se define
n! = n* (n - 1) * (n - 2) *…* (n-x)
en donde n-x será igual a 0, para describir esta situación utilizaremos como ejemplo
5! que es el producto de 5*4*3*2*1, el cual es igual a 120.
Antes que nada, procedemos a preguntar al usuario el número del cual desea
obtener el factorial, ese valor nos permitirá saber cuántas veces se mandara a
llamar la función a sí misma, la función consiste en realizar la formula anterior y el
resultado final será obtenido de la siguiente manera:
res=n*fac(n-1);
pero para poder obtener el resultado(res) final es necesario hacer una condición
que nos permitirá saber cuándo tenemos que dejar de realizar la función, ejemplo:
n=5
(a) (b)
Si n=0 Entonces
res <- 1;
Sino
FinSi
FinFuncion
Algoritmo factorial
Escribir "";
Escribir "";
Escribir "Introduce el numero: ";
Leer n;
Escribir "El factorial del numero " ,n, " es: ", fac(n);
Escribir "";
Escribir "";
FinAlgoritmo
Prueba de Escritorio.
FACTORIAL DE UN NUMERO
EJEMPLO: n=5
n=1
2*1!=2
2! = 2 (2 -
Realizamos la operación 1)!
n=2
3*2!=6
3! = 3 (3 -
Realizamos la operación 1)!
n=3
4*3!=24
4! = 4 (4 -
Realizamos la operación 1)!
n=4
5*4!=120
5! = 5 (5 -
Realizamos la operación 1)!
Codificación
#include<iostream>
using namespace std;
int factorial(int);
int main(){
int n;
cout<<endl<<" FACTORIAL"<<endl<<endl<<endl;
cout<<"Introduce el numero: ";
cin>>n;
cout<<endl;
cout<<"El factorial del numero "<<n<<" es: "<<factorial(n)<<endl<<endl<<endl;
}
int factorial(int n){
int fac;
if(n==0)
return 1;
else
return n*factorial(n-1);
}
SERIE DE FIBONACCI
0, 1, 1, 2, 3, 5, 8, 13, 21,…
Comienza con 0 y 1, y tiene la propiedad de que cada número subsiguiente es la
suma de los dos números anteriores de la serie.
Antes que nada, procedemos a solicitar al usuario que introduzca el número del cual
quiere calcular el valor Fibonacci, este valor nos permitirá empezar con los cálculos
y en el caso del siguiente código nos permitirá determinar cuántas veces se ejecuta
el siclo para poder obtener el resultado de la serie.
n=5
Construcción del algoritmo:
Algoritmo fibo
Definir n,res,n1,n2 como entero;
n1<--1;
n2<-1;
Escribir " FIBONACCI";
Escribir "";
Escribir "Cuantos numeros de la serie quieres ver: ";
Leer n;
Escribir "";
Mientras n>0 Hacer
res<-n1+n2;
n1<-n2;
n2<-res;
Si n>1 Entonces
Escribir Sin Saltar res,"-";
Sino
si n<=1 Entonces
Escribir Sin Saltar res,"";
FinSi
FinSi
n<-n-1;
FinMientras
Escribir "";
Escribir "";
FinAlgoritmo
Prueba de Escritorio.
SERIE DE FIBONACCI
EJEMPLO: n=5
n1= -1 n2=1
valores iniciales de n1 y
n2
n=5
n=4
n=3
n=2
n=1
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int n,res,n1=-1,n2=1;
cout<<endl<<" FIBONACCI"<<endl<<endl<<endl;
cout << "Cuantos numeros de la serie quieres ver: ";
cin >> n;
cout <<endl<<endl;
do{
res=n1+n2;
n1=n2;
n2=res;
if(n>1)
cout <<res<<" - ";
else if(n<=1)
cout <<res<<" ";
n--;
}while(n>0);
cout <<endl<<endl;
return 0;
}
El segundo algoritmo es el Recursivo, hecho por Daniel.
Análisis del problema:
= 1 + 0 =1
= 2 + 1 =3
n=0
n Si
n=1
Fibonacci(n)
Fibonacci (n-1) +
Si n > 1
Fibonacci(n-2)
Construcción del algoritmo:
La siguiente imagen nos muestra el siguiente del algoritmo recursivo del factorial de
un numero N.
Codificación
#include<stdio.h>
int Fibonacci(int);
void generarSerie();
void Mostrar(int n);
int main()
{
generarSerie();
return 0;
}
int Fibonacci(int n)
{
if(n == 0 | n == 1 )
{
return n;
}
else
{
return (Fibonacci(n-1) + Fibonacci(n-2));
}
}
void generarSerie()
{
int n,i;
printf("\nHasta que termino de la serie desea ver? ");
scanf("%d",&n);
i=0;
while(i<n)
{
Mostrar(Fibonacci(i));
i++;
}
}
void Mostrar(int n)
{
printf("\n%3d",n);
}
El tercer algoritmo es el Estructurado (Utilizando Funciones), hecho por Daniel.
Análisis del problema:
Fibonacci (0) = 0
Fibonacci (1) = 0
= 1 + 0 =1
= 2 + 1 =3
#include<stdio.h>
int CapturaDatos();
int FunFibonacci(int);
void generarSerie();
void Mostrar(int n);
int main()
{
int numero;
generarSerie();
return 0;
}
int CapturaDatos()
{
int num;
printf("\nTeclee el numero que desea ver de la serie de fibonacci: ");
scanf("%d",&num);
return num;
}
int FunFibonacci(int n)
{
int i,fibo,fiba,fibb;
if( n == 0 | n == 1)
{
fibo = n;
}
else
{
fiba = 0;
fibb = 1;
i = 2;
while(i <= n)
{
fibo = fibb + fiba;
fiba = fibb;
fibb = fibo;
i++;
}
}
return fibo;
}
void generarSerie()
{
int n,i;
printf("\nHasta que termino de la serie desea ver?");
scanf("%d",&n);
i=0;
while(i<n)
{
Mostrar(FunFibonacci(i));
i++;
}
}
void Mostrar(int n)
{
printf("\n%3d",n);
}
Conclusiones
El objetivo de esta práctica se cumplió, ya que cada uno de los integrantes,
comprendió y aplico la Metodología del diseño y análisis de los algoritmos
computacionales, aunque debemos aclarar que solo ocupamos la parte del diseño,
con forme avance el curso, se aplicara el análisis de los algoritmos, donde se
evalúa el espacio y el tiempo.
Por otro lado se entendió, como hacer una prueba de escritorio y como esta
influye en las correcciones o redefiniciones del algoritmo final (pseudocódigo), así
mismo cada uno analizo el problema de forma distinta.
Para cumplir de forma completa algunos integrantes realizaron más de un
algoritmo para obtener una mejor compresión.
Bibliografía