Escopo de Vari´ aveis e Fun¸ c˜ oes Recursivas
Introdu¸ c˜ ao a Programa¸ c˜ ao de Computadores
Noemi Rodriguez
Departamento de Inform´atica, PUC-Rio
14 de Setembro de 2020
Recurs˜ ao
Exemplo: potencia¸c˜ ao I defini¸c˜ ao recursiva
pot(x , k) =
( 1 se k = 0
x ∗ pot(x, k − 1) se k>0
Potencia¸c˜ ao
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
p r i n t (" e s c r e v a d o i s n ´u m e r o s i n t e i r o s : ") n u m , e x p = i o.r e a d(" * n ", " * n ")
m e u r e s u l t a d o = p o t ( n u m , e x p ) r e s u l t a d o c e r t o = n u m ^ e x p - - t e s t a n d o r e s u l t a d o :
i f m e u r e s u l t a d o = = r e s u l t a d o c e r t o t h e n
p r i n t(" A c e r t e i . O r e s u l t a d o ´e : ", m e u r e s u l t a d o ) e l s e
p r i n t( s t r i n g . f o r m a t
(" E r r e i : - ( O r e s u l t a d o c e r t o ´e % d e c a l c u l e i % d ", r e s u l t a d o c e r t o , m e u r e s u l t a d o ) )
e n d
Potencia¸c˜ ao
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
p r i n t (" e s c r e v a d o i s n ´u m e r o s i n t e i r o s : ") n u m , e x p = i o.r e a d(" * n ", " * n ")
m e u r e s u l t a d o = p o t ( n u m , e x p ) r e s u l t a d o c e r t o = n u m ^ e x p
- - t e s t a n d o r e s u l t a d o :
i f m e u r e s u l t a d o = = r e s u l t a d o c e r t o t h e n
p r i n t(" A c e r t e i . O r e s u l t a d o ´e : ", m e u r e s u l t a d o ) e l s e
p r i n t( s t r i n g . f o r m a t
(" E r r e i : - ( O r e s u l t a d o c e r t o ´e % d e c a l c u l e i % d ", r e s u l t a d o c e r t o , m e u r e s u l t a d o ) )
e n d
Potencia¸c˜ ao
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
p r i n t (" e s c r e v a d o i s n ´u m e r o s i n t e i r o s : ") n u m , e x p = i o.r e a d(" * n ", " * n ")
m e u r e s u l t a d o = p o t ( n u m , e x p ) r e s u l t a d o c e r t o = n u m ^ e x p - - t e s t a n d o r e s u l t a d o :
i f m e u r e s u l t a d o = = r e s u l t a d o c e r t o t h e n
p r i n t(" A c e r t e i . O r e s u l t a d o ´e : ", m e u r e s u l t a d o ) e l s e
p r i n t( s t r i n g . f o r m a t
(" E r r e i : - ( O r e s u l t a d o c e r t o ´e % d e c a l c u l e i % d ", r e s u l t a d o c e r t o , m e u r e s u l t a d o ) )
e n d
Recurs˜ ao — funcionamento
Exemplo: potencia¸c˜ ao
I usando a defini¸c˜ ao recursiva
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
(x, k) express˜ ao avaliada pot(x , k)
pot(x, 0) return 1 1
pot(x, 1) return x * pot(x, 0) x
pot(x, 2) return x * pot(x, 1) x
2pot(x, 3) return x * pot(x, 2) x
3pot(x, 4) return x * pot(x, 3) x
4Recurs˜ ao — funcionamento
Exemplo: potencia¸c˜ ao
I usando a defini¸c˜ ao recursiva
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
(x, k) express˜ ao avaliada pot(x, k)
pot(x, 0) return 1 1
pot(x, 1) return x * pot(x, 0) x
pot(x, 2) return x * pot(x, 1) x
2pot(x, 3) return x * pot(x, 2) x
3pot(x, 4) return x * pot(x, 3) x
4Recurs˜ ao — funcionamento
Exemplo: potencia¸c˜ ao
I usando a defini¸c˜ ao recursiva
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
(x, k) express˜ ao avaliada pot(x, k)
pot(x, 0) return 1 1
pot(x, 1) return x * pot(x, 0) x
pot(x, 2) return x * pot(x, 1) x
2pot(x, 3) return x * pot(x, 2) x
3pot(x, 4) return x * pot(x, 3) x
4Recurs˜ ao — funcionamento
Exemplo: potencia¸c˜ ao
I usando a defini¸c˜ ao recursiva
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
(x, k) express˜ ao avaliada pot(x, k)
pot(x, 0) return 1 1
pot(x, 1) return x * pot(x, 0) x pot(x, 2) return x * pot(x, 1) x
2pot(x, 3) return x * pot(x, 2) x
3pot(x, 4) return x * pot(x, 3) x
4Recurs˜ ao — funcionamento
Exemplo: potencia¸c˜ ao
I usando a defini¸c˜ ao recursiva
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
(x, k) express˜ ao avaliada pot(x, k)
pot(x, 0) return 1 1
pot(x, 1) return x * pot(x, 0) x pot(x, 2) return x * pot(x, 1) x
2pot(x, 3) return x * pot(x, 2) x
3pot(x, 4) return x * pot(x, 3) x
4Recurs˜ ao — funcionamento
Exemplo: potencia¸c˜ ao
I usando a defini¸c˜ ao recursiva
f u n c t i o n p o t ( x , k )
- - s u p o n d o q u e k ´e i n t e i r o > 0 i f k = = 0 t h e n
r e t u r n 1 e l s e
r e t u r n x * p o t ( x , k - 1 ) e n d
e n d
(x, k) express˜ ao avaliada pot(x, k)
pot(x, 0) return 1 1
pot(x, 1) return x * pot(x, 0) x
pot(x, 2) return x * pot(x, 1) x
2pot(x, 3) return x * pot(x, 2) x
3pot(x, 4) return x * pot(x, 3) x
4Potencia¸c˜ ao - e expoentes negativos?
I o que acontece com programa anterior nesse caso?
I verificar!
I programa em www.inf.puc-rio.br/~noemi/inf1031/
code/aula05/potencia.lua
Potencia¸c˜ ao - e expoentes negativos?
I o que acontece com programa anterior nesse caso?
I verificar!
I programa em www.inf.puc-rio.br/~noemi/inf1031/
code/aula05/potencia.lua
Potencia¸c˜ ao - e expoentes negativos?
f u n c t i o n p o t ( x , k ) i f k = = 0 t h e n
r e t u r n 1
e l s e i f k > 0 t h e n r e t u r n x * p o t ( x , k - 1 ) e l s e
r e t u r n 1 / p o t ( x , - k ) e n d
e n d
I cuidado! agora o resultado n˜ ao ´ e inteiro!
p r i n t (" e s c r e v a d o i s n ´u m e r o s i n t e i r o s : ") n u m , e x p = i o.r e a d(" * n ", " * n ")
m e u r e s u l t a d o = p o t ( n u m , e x p )
i f ( m e u r e s u l t a d o - r e s u l t a d o c e r t o ) < t o l e r a n c i a t h e n
Potencia¸c˜ ao - e expoentes negativos?
f u n c t i o n p o t ( x , k ) i f k = = 0 t h e n
r e t u r n 1
e l s e i f k > 0 t h e n r e t u r n x * p o t ( x , k - 1 ) e l s e
r e t u r n 1 / p o t ( x , - k ) e n d
e n d
I cuidado! agora o resultado n˜ ao ´ e inteiro!
p r i n t (" e s c r e v a d o i s n ´u m e r o s i n t e i r o s : ") n u m , e x p = i o.r e a d(" * n ", " * n ")
m e u r e s u l t a d o = p o t ( n u m , e x p )
i f ( m e u r e s u l t a d o - r e s u l t a d o c e r t o ) <
t o l e r a n c i a t h e n
Escopo de vari´ aveis
I Vari´ aveis globais (usadas at´ e agora!) I Declara¸ c˜ ao impl´ıcita
I Vis´ıvel em todo o ambiente subsequente
I Vari´ aveis locais
I Declara¸ c˜ ao expl´ıcita
I Vis´ıvel apenas dentro do ambiente que a declara
IParˆ ametros s˜ ao vari´ aveis locais ` a fun¸ c˜ ao I Tende a ter acesso mais eficiente
I Protegem o mal uso do ambiente global
I Boa pr´atica de programa¸c˜aoa = 2 b = 3 c = 4
f = f u n c t i o n ( b ) l o c a l a = 4
p r i n t( a , b ) - - v a r i ´a v e i s l o c a i s p r i n t( c , d ) - - v a r i ´a v e i s g l o b a i s e n d
f ( 7 ) f ( 9 )
p r i n t( a , b ) - - v a r i ´a v e i s g l o b a i s
Sa´ıda:
4 , 7 4 , n i l 4 , 9 4 , n i l 2 , 3
Escopo de vari´ aveis
I Vari´ aveis globais (usadas at´ e agora!) I Declara¸ c˜ ao impl´ıcita
I Vis´ıvel em todo o ambiente subsequente I Vari´ aveis locais
I Declara¸ c˜ ao expl´ıcita
I Vis´ıvel apenas dentro do ambiente que a declara
IParˆ ametros s˜ ao vari´ aveis locais ` a fun¸ c˜ ao I Tende a ter acesso mais eficiente
I Protegem o mal uso do ambiente global
I Boa pr´atica de programa¸c˜aoa = 2 b = 3 c = 4
f = f u n c t i o n ( b ) l o c a l a = 4
p r i n t( a , b ) - - v a r i ´a v e i s l o c a i s p r i n t( c , d ) - - v a r i ´a v e i s g l o b a i s e n d
f ( 7 ) f ( 9 )
p r i n t( a , b ) - - v a r i ´a v e i s g l o b a i s
Sa´ıda:
4 , 7 4 , n i l 4 , 9 4 , n i l 2 , 3
Escopo de vari´ aveis
I Vari´ aveis globais (usadas at´ e agora!) I Declara¸ c˜ ao impl´ıcita
I Vis´ıvel em todo o ambiente subsequente I Vari´ aveis locais
I Declara¸ c˜ ao expl´ıcita
I Vis´ıvel apenas dentro do ambiente que a declara
IParˆ ametros s˜ ao vari´ aveis locais ` a fun¸ c˜ ao I Tende a ter acesso mais eficiente
I Protegem o mal uso do ambiente global
I Boa pr´atica de programa¸c˜aoa = 2 b = 3 c = 4
f = f u n c t i o n ( b ) l o c a l a = 4
p r i n t( a , b ) - - v a r i ´a v e i s l o c a i s p r i n t( c , d ) - - v a r i ´a v e i s g l o b a i s e n d
f ( 7 ) f ( 9 )
Sa´ıda:
4 , 7 4 , n i l 4 , 9 4 , n i l 2 , 3
Escopo de vari´ aveis
I Vari´ aveis globais (usadas at´ e agora!) I Declara¸ c˜ ao impl´ıcita
I Vis´ıvel em todo o ambiente subsequente I Vari´ aveis locais
I Declara¸ c˜ ao expl´ıcita
I Vis´ıvel apenas dentro do ambiente que a declara
IParˆ ametros s˜ ao vari´ aveis locais ` a fun¸ c˜ ao I Tende a ter acesso mais eficiente
I Protegem o mal uso do ambiente global
I Boa pr´atica de programa¸c˜aoa = 2 b = 3 c = 4
f = f u n c t i o n ( b ) l o c a l a = 4
p r i n t( a , b ) - - v a r i ´a v e i s l o c a i s p r i n t( c , d ) - - v a r i ´a v e i s g l o b a i s e n d
f ( 7 ) f ( 9 )
p r i n t( a , b ) - - v a r i ´a v e i s g l o b a i s
Sa´ıda:
4 , 7 4 , n i l 4 , 9 4 , n i l 2 , 3
Fun¸c˜ oes: escopo
Passagem de parˆ ametros para fun¸ c˜ oes I Na chamada, s˜ ao passados valores
I Valores inicializam parˆ ametros (vari´ aveis locais)
f u n c t i o n t e s t e ( a , b , c ) a = a + 1
b = b + 1 c = c + 1 e n d
a = 1 0 b = 1 1 c = 1 2 t e s t e ( a , b , c ) p r i n t( a , b , c )
I
Sa´ıda:
1 0 1 1 1 2 - - p a r ^a m e t r o s s ~a o v a r i ´a v e i s l o c a i s
Fun¸c˜ oes: escopo
Passagem de parˆ ametros para fun¸ c˜ oes I Na chamada, s˜ ao passados valores
I Valores inicializam parˆ ametros (vari´ aveis locais)
f u n c t i o n t e s t e ( a , b , c ) a = a + 1
b = b + 1 c = c + 1 e n d
a = 1 0 b = 1 1 c = 1 2 t e s t e ( a , b , c ) p r i n t( a , b , c ) I
Sa´ıda:
1 0 1 1 1 2 - - p a r ^a m e t r o s s ~a o v a r i ´a v e i s l o c a i s
Fun¸c˜ oes
Passagem de parˆ ametros para fun¸ c˜ oes I Nomes podem ser quaisquer
f u n c t i o n t e s t e ( pa , pb , p c ) p a = p a + 1
p b = p b + 1 p c = p c + 1
r e t u r n ( p a + p b + p c ) e n d
a = 1 0 b = 1 1 c = 1 2
p r i n t( t e s t e ( a , b , c ) ) p r i n t( a , b , c )
I Sa´ıda:
3 6
1 0 1 1 1 2 - - p a r ^a m e t r o s s ~a o v a r i ´a v e i s l o c a i s
Fun¸c˜ oes
Passagem de parˆ ametros para fun¸ c˜ oes I Nomes podem ser quaisquer
f u n c t i o n t e s t e ( pa , pb , p c ) p a = p a + 1
p b = p b + 1 p c = p c + 1
r e t u r n ( p a + p b + p c ) e n d
a = 1 0 b = 1 1 c = 1 2
p r i n t( t e s t e ( a , b , c ) ) p r i n t( a , b , c )
I Sa´ıda:
3 6
1 0 1 1 1 2 - - p a r ^a m e t r o s s ~a o v a r i ´a v e i s l o c a i s
Recurs˜ ao
Exemplo: m´ aximo divisor comum I Algoritmo de Euclides
MDC(x, y) =
( y se x%y = 0 MDC(y, x%y) caso contr´ ario
f u n c t i o n m d c ( n1 , n 2 ) l o c a l r e s t o = n 1 % n 2 i f r e s t o = = 0 t h e n
r e t u r n n 2 e l s e
r e t u r n m d c ( n2 , r e s t o ) e n d
e n d
p r i n t( m d c ( 4 2 , 2 4 ) ) - - > 6
Recurs˜ ao
Exemplo: m´ aximo divisor comum I Algoritmo de Euclides
MDC(x, y) =
( y se x%y = 0 MDC(y, x%y) caso contr´ ario
f u n c t i o n m d c ( n1 , n 2 ) l o c a l r e s t o = n 1 % n 2 i f r e s t o = = 0 t h e n
r e t u r n n 2 e l s e
r e t u r n m d c ( n2 , r e s t o ) e n d
e n d
p r i n t( m d c ( 4 2 , 2 4 ) ) - - > 6
ainda escopo...
I e se mudarmos o programa para:
f u n c t i o n m d c ( n1 , n 2 ) l o c a l r e s t o = n 1 % n 2 i f r e s t o = = 0 t h e n
r e t u r n n 2 e l s e
l o c a l d i v = m d c ( n2 , r e s t o )
p r i n t (" r e s t o a q u i e r a : ". . r e s t o ) r e t u r n d i v
e n d e n d
p r i n t( 8 5 , 2 0 )
I o que ser´ a impresso?
I e se tirarmos a declara¸ c˜ ao de local de resto? experimente! I www.inf.puc-rio.br/~noemi/inf1031/code/aula05/mdc.
lua
ainda escopo...
I e se mudarmos o programa para:
f u n c t i o n m d c ( n1 , n 2 ) l o c a l r e s t o = n 1 % n 2 i f r e s t o = = 0 t h e n
r e t u r n n 2 e l s e
l o c a l d i v = m d c ( n2 , r e s t o )
p r i n t (" r e s t o a q u i e r a : ". . r e s t o ) r e t u r n d i v
e n d e n d
p r i n t( 8 5 , 2 0 )
I o que ser´ a impresso?
I e se tirarmos a declara¸ c˜ ao de local de resto? experimente! I www.inf.puc-rio.br/~noemi/inf1031/code/aula05/mdc.
lua
ainda escopo...
I e se mudarmos o programa para:
f u n c t i o n m d c ( n1 , n 2 ) l o c a l r e s t o = n 1 % n 2 i f r e s t o = = 0 t h e n
r e t u r n n 2 e l s e
l o c a l d i v = m d c ( n2 , r e s t o )
p r i n t (" r e s t o a q u i e r a : ". . r e s t o ) r e t u r n d i v
e n d e n d
p r i n t( 8 5 , 2 0 )