Beruflich Dokumente
Kultur Dokumente
Recursão II
Eduardo C. Xavier
6 de Junho de 2017
Roteiro
1 Recursão – Relembrando
2 Cálculo de Potências
3 Torres de Hanoi
4 Recursão e Enumeração
5 Exercı́cio
Suponha que temos que calcular x n para n inteiro positivo. Como calcular
de forma recursiva?
x n é:
1 se n = 0.
xx n 1 caso contrário.
e l s e i f ( n%2 == 0 ) { // s e n é p a r
aux = p o t ( x , n / 2 ) ;
r e t u r n aux ⇤ aux ;
}
e l s e { // s e n é i m p a r
aux = p o t ( x , ( n 1 ) / 2 ) ;
r e t u r n x ⇤ aux ⇤ aux ;
}
}
A B C
Teorema
É possı́vel resolver o problema das torres de Hanoi com n discos.
Prova.
Base da Indução: n = 1. Neste caso temos apenas um disco. Basta
mover este disco da estaca A para a estaca C.
Hipótese de Indução: Sabemos como resolver o problema quando há
n 1 discos.
Prova.
Passo de Indução: Devemos resolver o problema para n discos
assumindo que sabemos resolver o problema com n 1 discos.
I Por hipótese de indução sabemos mover os n 1 primeiros discos da
estaca A para a estaca B usando a estaca C como auxiliar.
I Depois de movermos estes n 1 discos, movemos o maior disco (que
continua na estaca A) para a estaca C.
I Novamente pela hipótese de indução sabemos mover os n 1 discos da
estaca B para a estaca C usando a estaca A como auxiliar.
Com isso temos uma solução para o caso onde há n discos.
//Move m a i o r d i s c o p a r a Fim
p r i n t f ( ”\nMova d i s c o %d da e s t a c a %c p a r a %c . ” , n , e s t a c a I n i , estacaFim ) ;
#i n c l u d e <s t d i o . h>
i n t main ( ) {
h a n o i ( 4 , ’A ’ , ’C ’ , ’B ’ ) ;
p r i n t f ( ”\n” ) ;
}
// D i s c o s s ã o numerados de 1 a t é n
v o i d h a n o i ( i n t n , c h a r e s t a c a I n i , c h a r e s t a c a F i m , c h a r e s t a c a A u x ){
i f ( n==1)
p r i n t f ( ”\nMova d i s c o %d da e s t a c a %c p a r a %c . ” , n , e s t a c a I n i , estacaFim ) ;
else{
h a n o i ( n 1, e s t a c a I n i , e s t a c a A u x , e s t a c a F i m ) ;
p r i n t f ( ”\nMova d i s c o %d da e s t a c a %c p a r a %c . ” , n , e s t a c a I n i , estacaFim ) ;
h a n o i ( n 1, e s t a c a A u x , e s t a c a F i m , e s t a c a I n i ) ;
}
}
x0 + x1 + x2 = C
x 0 + x 1 + . . . + xn 1 + xn = C
x0 + x1 + . . . + xn 1 =C xn
f u n ç ã o s o l u t i o n ( n , C , x ){
Se n == 0 Então
x [0] = C
I m p r i m a v e t o r s o l u ç ã o x
Senão
Para c a d a v a l o r V e n t r e 0 e C f a ç a
x[n] = V
solution (n , C x [ n ] , x ) // R e s o l v e m o s o p r o b . menor r e c u r s i v a m e n t e
}
i n t main ( i n t a r g c , c h a r ⇤ a r g v [ ] ) {
i f ( a r g c != 3){
p r i n t f ( ” E x e c u t e i n f o r m a n d o n ( num . de v a r i . ) e C ( c o n s t a n t e i n t . p o s i t i v a )\ n” ) ;
return 0;
}
i n t n = a t o i ( argv [ 1 ] ) ;
i n t C = a t o i ( argv [ 2 ] ) ;
i n t ⇤x = m a l l o c ( ( n+1) ⇤ s i z e o f ( i n t ) ) ;
solution (n , C, x , n , C) ;
free (x );
}
v o i d p r i n t S o l ( i n t x [ ] , i n t n , i n t C){
i n t i , aux =0;
f o r ( i =0; i<n ; i ++)
p r i n t f ( ”%d + ” , x [ i ] ) ;
p r i n t f ( ”%d = %d\n” , x [ n ] , C ) ;
}
v o i d s o l u t i o n ( i n t n , i n t C , i n t x [ ] , i n t n O r i , i n t COri ){
i f ( n==0){ // Caso b a s e
x [0] = C;
p r i n t S o l ( x , n O r i , COri ) ;
}else{
int i ;
f o r ( i =0; i<=C ; i ++){
x [ n ] = i ; // p a r a c a d a v a l o r s e t a d o de x [ n ]
// r e s o l v a o p r o b l e m a menor
s o l u t i o n ( n 1, C x [ n ] , x , n O r i , COri ) ;
}
}
}
Eduardo C. Xavier (Instituto de Computação – Unicamp) MC-102 6 de Junho de 2017 29 / 31
Exercı́cio