INSTITUTO POLITÉCNICO NACIONAL
ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y
ELÉCTRICA
UNIDAD CULHUACAN
Unidad de Aprendizaje:
Análisis de Algoritmos
Profesor:
Beatriz Dolores Guardián Soto
Práctica 2:
Factorial y Serie de Fibonacci
Integrantes:
Montoya Flores Daniel
Mora Martínez Yeredith Giovanna
Naveda Leyva Martín
Villanueva Carranza Aline
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 primer algoritmo que se presentara será el iterativo, hecho por Aline.
Análisis del problema:
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
Construcción del algoritmo:
Primero se construye el algoritmo general, que es la respuesta inmediata a la
solución del problema.
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 n=1 o n=0 entonces
escribir “factorial es 1”;
si no
para i<-n; hasta 1; (i<-i-1) hacer
n*<- i-1;
fin para
fin si
escribir “n”;
fin
PRUEBA DE ESCRITORIO
# n i
1 3 3
2 2
0
En la primera depuración se observó que aún había errores
Proceso factorial
Definir n,i,fac Como Entero;
Escribir "Ingrese el numero para sacar el factorial: ";
Leer n;
Si n=1 o n=0 Entonces
Escribir "El factorial de ", n, " es: 1";
SiNo
fac<-n;
Para i<-n hasta 2 Con Paso -1 Hacer
fac <- fac * (i-1);
FinPara
Escribir "El factorial de ",n," es: ",fac;
FinSi
FinProceso
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;
}
El segundo algoritmo es el Estructurado (utilizando funciones), elaborado por
Yeredith.
Análisis del problema:
1. Se pide un dato, supóngase se quiere obtener el factorial de 3
2. El factorial de un número es la multiplicación de 1 hasta n excepto cuando es
un número negativo o 0.
3. Factorial de 3 es 1x2x3 = 6
4. Si se quiere obtener el factorial de 0 será uno ya que la ecuación dice que
n!/n= (n-1)! Es decir que 1!/1=(1-1) por lo tan1=0.
5. El factorial de un número negativo es 0.
Construcción del algoritmo:
Funcion ped_dat
escribir "ingese un numero: "
leer num
FinFuncion
Funcion cicl_fact
Para i<-1 Hasta num Hacer
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
Escribir "el factorial", num
escribir "es", fact
FinAlgoritmo
Prueba de Escritorio.
Sea num=5
Si num es diferente de 0 y mayor a 0
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
Análisis del problema
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:
Funcion res <- fac ( n )
Si n=0 Entonces
res=1;
Sino
res=n*fac(n-1);
Fin Si
Fin Funcion
La parte donde se ve reflejada la fórmula es:
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
La evaluación de 5! se lleva a cabo como muestra la figura. La figura (a) muestra la
manera en que proceden las llamadas recursivas hasta que 1! se evalúa como 1, lo
cual termina la recursividad. La figura (b) muestra los valores devueltos por cada
llamada recursiva a su llamada original, hasta que se calcula y se devuelve el valor
final.
(a) (b)
Construcción del Algoritmo
Funcion res <- fac ( n )
Definir res Como Entero;
Si n=0 Entonces
res <- 1;
Sino
res <- n*fac(n-1);
FinSi
FinFuncion
Algoritmo factorial
Definir n Como Entero;
Escribir "";
Escribir " FACTORIAL";
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);
}
Definición del problema 2: Resolver el problema de encontrar el factorial de un
número.
El primer algoritmo es el Iterativo (Utilizando ciclos), hecho por Martin.
Análisis del problema:
SERIE DE FIBONACCI
La serie se presenta en la naturaleza y, en particular, describe la forma de una
espiral, la 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.
Mientras n>0 Hacer
res<-n1+n2;
n1<-n2;
n2<-res;
Escribir Sin Saltar res," ";
n<-n-1;
Fin Mientras
Antes de empezar los cálculos determinamos n1=-1 y n2=1 ya que esto nos ayudara
a determinar correctamente la serie y una vez dentro del siclo iremos
decrementando el valor de n hasta que n sea igual a 0 con el fin de salir y concluir
las operaciones adecuadamente, ejemplo:
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
res = -1+1; n1=1; n2=0;
res="0" n=5-1
n=4
res = 1+0; n1=0; n2=1;
res="0-1" n=4-1
n=3
res = 0+1; n1=1; n2=1;
res="0-1-1" n=3-1
n=2
res = 1+1; n1=1; n2=2;
res="0-1-1-2" n=2-1
n=1
res = 1+2; n1=2; n2=3;
res="0-1-1-2-3" n=1-1
Codificación
#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:
El cálculo de la sucesión de Leonardo de Pisa, conocido como Fibonacci:
0, 1, 1, 2, 3, 5, 8, 13, 21,…., etcétera.
El Fibonacci de un número se obtiene la suma de los dos números Fibonacci
anteriores. Por definición:
Fibonacci (0) = 0 Paso básico
Fibonacci (1) = 0 Paso básico
Fibonacci (2) = Fibonacci (1) + Fibonacci (0)
= 1 + 0 =1
Fibonacci (3) = Fibonacci (3) + Fibonacci (2)
= 2 + 1 =3
Fibonacci (n) = Fibonacci (n-1) + Fibonacci (n-2) Paso Recursivo
La fórmula siguiente representa la definición de la serie de Fibonacci.
n=0
n Si
n=1
Fibonacci(n)
Fibonacci (n-1) +
Si n > 1
Fibonacci(n-2)
Construcción del algoritmo:
funcion numFibo <- FibonacciRec(n)
si n = 0 o n = 1 entonces
numFibo <- n;
SiNo
numFibo <- FibonacciRec(n-1) + FibonacciRec(n-2);
FinSi
FinFuncion
Proceso Fibonacci
Definir n,numFibo Como Entero;
leer n;
numFibo <- FibonacciRec(n);
Escribir numFibo;
FinProceso
Prueba de Escritorio.
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:
Considerando el análisis anterior (algoritmo recursivo).
0, 1, 1, 2, 3, 5, 8, 13, 21,…., etcétera.
El Fibonacci de un número se obtiene la suma de los dos números Fibonacci
anteriores. Por definición:
Fibonacci (0) = 0
Fibonacci (1) = 0
Fibonacci (2) = Fibonacci (1) + Fibonacci (0)
= 1 + 0 =1
Fibonacci (3) = Fibonacci (3) + Fibonacci (2)
= 2 + 1 =3
Fibonacci (n) = Fibonacci (n-1) + Fibonacci (n-2)
Construcción del algoritmo:
funcion CapturaDatos(n por referencia)
leer n;
FinFuncion
funcion Fibonacci(n)
Definir fiba,fibo,i,fibb como entero;
si n = 0 o n = 1 Entonces
fibo <- n;
SiNo
fiba <- 0;
fibb <- 1;
i <- 2;
mientras i <= n hacer
fibo <- fibb +fiba;
fiba <- fibb;
fibb <- fibo;
i <- i + 1;
FinMientras
mostrar(fibo);
FinSi
FinFuncion
Funcion mostrar(n)
Escribir n;
FinFuncion
Proceso NumeroFibonacci
Definir n como entero;
CapturaDatos(n);
Fibonacci(n);
FinProceso
Prueba de Escritorio.
La prueba se realiza al módulo o función que genera la serie de Fibonacci(n).
n Fibo Fiba Fibb I
6 0 1 2
1 1 1 3
2 1 2 4
3 2 3 5
5 3 5 6
8 5 8 7
Codificación
#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
Aguilar, L. J. (2008). Fundamentos de programación. Algoritmos, Estructura de
datos y objetos. MC Graw Hill.
Soto, B. D. (2018). Apuntes de clase.