Vous êtes sur la page 1sur 7

Unidad2

De la Bibliografa
Del Capitulo 5:
Ejercicios:5.1..5.5, 5.7, 5.12
Problemas: 5.1
Ejercicio 5.1
ConvertirlafuncionIterativaenRecursiva.
doubleloge()
{
doubleenl=delta=fact=1.0
Intn=1
Do{
enl+=delta
fact*=(++n)
delta=1.0/fact
}while(enl!=enl+delta)
Returnenl
}

RESPUESTA:
doubleloge(doubleenl,doublefact,intn)
{
doubledelta=1.0/fact
if(enl==enl+delta)returnenl
enl+=delta
fact*=(++n)
loge(enl,fact,n)
}
Ejercicio 5.2
Explicarporqlasiguientefuncinpuedeproducirunvalorincorrectocuandoseejecute.
longfactorial(intn)
{
if(n==0||n==1)return1
else
returnn*factorial(n)
}
RESPUESTA:
Sin<0entonces:
a) Onuncasetermina.
b) Odavueltaelbytenluegodemuchoandar,dandounresultadoerroneo.
Ejercicio 5.3
Cualeslasecuencianumericageneradaporlafunctionrecursivef()dellistadosillamamosa
f(5)
longf(longn)
{
if(n==0||n==1)return1
else
return3*f(n2)+2**f(n1)
}

RESPUESTA:
n

5
3
1
2
0
4

return3*F(3)+2*F(4)
return3*F(1)+2*F(2)
1
return3*F(0)+2*F(1)
1
return3*F(2)+2*F(3)

F(n)
Si(n==0)||(n==1)return1
Sinoreturn3*F(n2)+2*F(n1)
return3*13+2*41=121
return3*1+2*5=13
1
return3*1+2*1=5
1
return3*5+2*13=41

Ejercicio 5.4
Hacer una funcin recursiva vocales q cuente la cantidad de vocales
de una cadena.
RESPUESTA:
i: debe pasarse la longitud del vector, por ej strlen(frase)
Frase: La frase a analizar.
intvocales(inti,charfrase[])//retornalacantidaddevocalsdeunafrase.
{
if(i<0)return0 //Condiciondesalida:Seterminaronlasletrasaevaluar
if(frase[i]>90)frase[i]=frase[i]32
//Silaletraesminsculalapasamosamaysculas
if(frase[i]==A||frase[i]==E||frase[i]==I||frase[i]==O||frase[i]==U)
returnvocales(i,frase[])+1
else
returnvocales(i,frase[])+0
}

Ejercicio 5.5
a) Realizar la definicin recursiva del producto de nmeros naturales
usando solamente la operacin SUMA.
b) Realizar la definicin recursiva del conjunto de Permutaciones
posible de un nmero natural.
RESPUESTA:
a) Producto de dos numeros
int Prod(int x, int y)
{
if (y==0) return 0;
return Prod(x, --y) + x;
}
b) Permutaciones de un grupo de numeros n=n!
double Fact(int n)
{
if (n<=1) return 1;
return n* Fact(n-1);
}
Ejercicio 5.7 Ackermann
Escribir la function recursive q calcule la function de Ackerman:
Si (m = 0) A(m,n)= n+1;
Si (m>0 Y n>0) A(m-1, A(m, n-1));
Si (n = 0) A (m-1, 1);
RESPUESTA:
Int Ackerman (int m, int n)
{
if (m>0 && n>0) return Ackerman(m-1, Ackerman(m, n-1));
if (m == 0) return n+1;
if (n == 0) return Ackerman(m-1, 1);
}

Ejercicio 5.12
EscribirelEjercicio5.3demaneraIterativa.
RESPUESTA:
LongF(intn)
{
longx=0
while(n>1)
{
x+=3(n2)+2(n1)
n
}
returnx
}
Problema 5.1
Escribir una funcin q calcule en Numero de Combinatorias C(m,n)
C(m,n)=m!/{n!(m-n)!}
RESPUESTA:
Double Comb(int m, int n)
{
double Fm, Fn;
Fm=Fact(m);
Fn=Fact(n);
Return ( Fm/ (Fn(FmFn)) )
}

Unidad3

De la Bibliografa Del Capitulo 6:


Ejercicios: 6.1, 6.2,6.5, 6.6, 6.9.
Problemas: 6.8, 6.11

Ejercicio 6.1
Cual es la diferencia entre Ordenacin por Intercambio y el mtodo
Burbuja?
RESPUESTA:
Intercambio: Compara el elemento Inferior con todos los restantes
Burbuja: Va comparando de dos en dos, desde el elemento Inferior hacia
el Superior.
Ejercicio 6.2 Elementos duplicados
Escribir una funcin de ordenacin q elimine los elementos duplicados
RESPUESTA:
void ordIntercambioUNICOS (int a[], int *n)
{
int i, j, x; /* se realizan n-1 pasadas,a[o] ... a[n-2]
*/
for (i = 0 ; i<=(*n)-2 ; i++)/*coloca mnimo de a[i+1]...a[n-1]
en a[i] */
for (j = i+1 ; j <= (*n)-1 ; j++)
{
if (a[i] > a[j])
{
x = a[i];
a[i] = a[j];
a[j]= x ;
}
if (a[i] == a[j]) //Si son iguales hay q desplazar

hacia IZQ
{

for (x = j ; x <= (*n)-1 ; x++)


a[x] == a[x+1];
(*n)--;

}
}

Ejercicio 6.5
Setienelasiguientelista:
Original:47
3
21
32

56

92

Despusde2pasadasdelalgdeordenacin,elarrayquedo:
2daPasada:3
21
47
32
56
92
Q algoritmo de ordenacin se uso?
RESPUESTA:
OrdenacinporSeleccin
1erPasada:3
47
21

32

56

92

Ejercicio 6.6 Shell


Utiliceordenacinshell.encuentrelaspasadasylosintercambios.
vectorinicial8 43

17

40

16

18

97

11

RESPPUESTA:
n=9/2=4.5daunintervalo=4elementos.
pasada1
(43,16)=8
(40,11)=8
(43,7)=8

16
16
16

17
17
17

6
6
6

40
11
11

43
43
7

18
18
18

97
97
97

11
40
40

7
7
43

pasada2
(16,7)=8

17

11

16

18

97

40

43

pasada3sinintercambios.RecalculamoselIntervalo=4/2=2
pasada4
(7,6)=8
(17,11)=8
(97,43)=8

6
6
6

17
11
11

7
7
7

11
17
17

16
16
16

18
18
18

97
97
43

40
40
40

43
43
97

pasada5sinintercambios.RecalculamoselIntervalo=2/2=1
(8,6)=6
8
11
7
17
16
18
43
40
97
(11,7)=6
8
7
11
17
16
18
43
40
97
(17,16)=6 8
7
11
16
17
18
43
40
97
(43,40)=6 8
7
11
16
17
18
40
43
97
pasada6
(8,7)=6

11

16

17

18

40

Ejercicio 6.9
Utilizandobsquedabinariaencontrarel88yel20.
V[8
[0

13
1

17
2

26
3

44
4

56
5

88
6

97]
7]

43

97

RESPUESTA:

Buscamosel88:bajo=0 alto=7

medio=(alto+bajo)/2=3,5medio=3

Como(88>V[medio])entonces
Alto=7bajo=medio+1=4 medio=(alto+bajo)/2=5,5medio=5
Como(88>V[medio])entonces
Alto=7bajo=medio+1=6 medio=(alto+bajo)/2=6,5medio=6
Como88=V[medio]entoncesENCONTRADO

Buscamosel20:bajo=0 alto=7

medio=(alto+bajo)/2=3,5medio=3

Como(20<V[medio])entonces
alto=medio1=2
bajo=0

medio=(2+0)/2=1medio=1

Como(20>V[medio])entonces
alto=2
bajo=medio+1=2

medio=(alto+bajo)/2=2medio=2

Como(20>V[medio])entonces
alto=2
bajo=medio+1=3

medio=(alto+bajo)/2=2,5medio=2

Perocomo(bajo>alto)EntoncesNOENCONTRADO
Problemas 6.8
Realizarunprogramaquerealicelassiguientestareas:
a.Generaraleatoriamenteunalistade999numerosrealesde0a20000
b.Ordenarenmodocrecienteporelmetododelaburbuja
c.Ordenarenmodocrecienteporelmetodoshell
d.Buscar(binaria)siexisteelnumerox(leidodelteclado)enla
lista.
RESPUESTA
#include<base.h>
#defineELEMENTOS999
voidgeneralista(doublelista[],int)
voidburbuja(doublelista[],int)
voidshell(doublelista[],int)
voidmostrar(doublelista[],int)
voidBinaria(doublelista[],int,int)
voidbuscar(doublelista[],intx)

voidmain(void)
{

intop,pos
doublelista[ELEMENTOS]
generalista(lista[],ELEMENTOS)
do
{
cout<<"\n>>>>>>>>Menu<<<<<<<<<"
cout<<"\nIngreseopcion\n"
cout<<"1.OrdenarBurbuja\n"
cout<<"2.OrdenarShell\n"
cout<<"3.EncontrarunElemento\n"
cout<<"4.MostrarLista\n"
cout<< "0.Salir\n"
cout<<"Opcin:"<<endl
cin>>op
switch(op){
case0:break
case1:burbuja(lista,ELEMENTOS)break
case2:shell(lista,ELEMENTOS)
break
case3:buscar(lista[],ELEMTENTOS)break
case4:mostrar(lista,ELEMENTOS) break
default:cout<<"\nIngresunaopcionincorrecta"

}
}while(op!=0)
}

voidgeneralista(doublelista[],ELEMENTOS)
{

randomize()
for(inti=0i<ELEMENTOSi++)
lista[i]=random(20001)

voidburbuja(doublelista[],intx)
{

intpasada,j,interruptor=1
longaux
for(pasada=0pasada<x1&&interruptorpasada++)
{
interruptor=0
for(j=0j<xpasada1j++)
if(lista[j]>lista[j+1])
{
interruptor=1
aux=lista[j]
lista[j]=lista[j+1]
lista[j+1]=aux
}
}

voidordenacionShell(doublea[],intn)
{

inti,j,k,intervalo=n/2
doubletemp
while(intervalo>0)
{
for(i=intervaloini++)
{
j=iintervalo
while(j>=0)
{
k=j+intervalo
if(a[j] <=a[k])j=1/*terminaelbucle,parordenado*/
else{ temp=a[j]
a[j]=a[k]
a[k]=temp
j=intervalo
}
}
}
intervalo=intervalo/2
}

voidmostrar(doublelista[],intx)
{

for(inti=0i<xi++)
cout<<"Elemento["<<i<<"]="<<lista[i]<<endl

voidbuscar(doublelista[],intx)
{

int y, pos;
cout<<"\nIngresenumeroaserbuscado:"cin>>y
pos=Binaria(lista,ELEMENTOS,y)
if(pos>=0)cout<<"ElementoEncontradoenposicion"<<pos<<endl
elsecout<<"ElementoNOEncontrado"<<endl

int busquedaBin(intlista[],int n, int clave)/*Devuelve el ndice del elemento buscado, o1en

casodefallo*/
{
intcentral,bajo,alto,valorCentral
bajo=0 alto=n1
while(bajo<=alto)
{central=(bajo+alto)/2
/*ndicedeelementocentral*/
valorCentral=lista[central]/*valordelndicecentral*/
if(clave==valorCentral)returncentral/*devuelveposicin*/
elseif(clave<valorCentral)alto=central1/*sublistainferior*/
elsebajo=central+1/*irasublistasuperior*/
}
return1
/*elementonoencontrado*/
}

Ejercicio 6.11
Seleen2listasdenroenteros,AyB,de100y60elementos,resolver:
a) Ordenarc/udelaslistas
b) CrearunalistacporintercalacindeAyB
c) VisualizaralistaC
RESPUESTA
#include<base.h>
#defineN100
#defineM60
voidgeneralista(intlista[],int)//cdigodefinidoenejercicio6.8
voidmostrar(intlista[],int)
//cdigodefinidoenejercicio6.8
voidburbuja(intlista[],inta) //cdigodefinidoenejercicio6.8
voidordIntercambioUNICOS(inta[],int*n)//definidoenEjercicio6.2
voidintercalar(intlistaa[],intlistab[],intlistac[],intlenC)
voidmain(void)
{
inta,LenC=N+M
intlistaA[N],listaB[M],listaC[LenC]
generalista(listaA,N)
generalista(listaB,M)
burbuja(listaA,N)
burbuja(listaB,M)
cout<<"LISTASCREADASYORDENADAS\n\n"
mostrar(listaA,N)
mostrar(listaB,M)
intercalar(listaA,listaB,listaC,&LenC)
cout<<"LISTASINTERCALADA"<<endl<<endl
mostrar(listac,LenC)
getch()
}
voidintercalar(intA[],intB[],intC[],int*c)
{
for(inti=0,intx=0i<Ni++,x++)C[x]=A[i]
//CopioAdentrodeC
for(i=0i<Mi++,x++)C[x]=B[i]
//CopioBdentrodeC
ordIntercambioUNICOS (C[], c) //definidoenEjercicio 6.2
}