Author
bruce-brewer
View
21
Download
0
Embed Size (px)
DESCRIPTION
Recursividade e Funções Recursivas Aleatoriedade e Processos de Monte Carlo. Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008. Funções Encadeadas. - PowerPoint PPT Presentation
Recursividade e Funes Recursivas Aleatoriedadee Processos de Monte CarloPedro BarahonaDI/FCT/UNLIntroduo aos Computadores e Programao2 Semestre 2007/2008
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Funes EncadeadasComo foi visto em vrios exemplos anteriores, na especificao de uma funo podem ser chamadas outras funes, que por sua vez podem chamar outras funes. Assim uma funo (e em ltimo caso, um programa) pode ser vista como um encadeamento de funes. Por exemplo, a funo ang_vec/2 chama a funo mod_vec/2 na especificao abaixo indicada
Em algumas linguagens de programao, em vez de funes so usados procedimentos, mas a filosofia de encadeamento semelhante.De notar que o programa principal, pode ele prprio ser visto como uma funo.function a = ang_vec(V1,V2); % retorna ngulo em graus M = prod_int(V1,V2)) cos = M /(mod_vec(V1) * mod_vec(V2)) a = acos(cos)*180/piendfunction
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Funes RecursivasUm caso particular ocorre quando as funes se chamam a si prprias, isto , quando as funes so recursivas.Um exemplo muito simples o da funo factorial, que pode ser definida (incompletamente) comofact(n) = n * fact(n-1)Nestas condies, tal como nos ciclos, levanta-se o problema da terminao. Se uma funo se chama a si prpria, existe o risco de a computao se tornar infinita (entrar em ciclo fechado ou loop). pois condio necessria para evitar estes ciclos infinitos que sejam definidas e testadas em primeiro lugar as condies de fim da recursividade.
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Funes RecursivasEm geral, a recursividade feita com base num conjunto recursivo (indutivo), definido atravs de clusulasde base; um ou vrios elementos de base (que fecham a recurso) de recurso: uma definio recursiva que permite a obteno de elementos a partir de outros elementos.Num grande nmero de casos, o conjunto recursivo utilizado o conjunto dos numeros inteiros, em que1 (ou 0) um nmero inteiro (clusula de base)Se i inteiro, i+1 tambm inteiro (clusula de recurso)Tendo em conta esta estrutura recursiva, podemos definir (correctamente) a funo factorial tendo em conta a clusula de base e a clusula recursiva:
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Funes RecursivasNo caso da funo factorial basta ento testar inicialmente se o parmetro de entrada nulo. Em pseudo-cdigo, a funo definida como
Em Octave definida de uma forma semelhante
funo fact(n) se n = 0 ento fact 1 % elemento base seno fact n * fact(n-1) % definio recursiva fimse; fimfuno; function f = fact(n) if n == 0 f = 1 else f = n*fact(n-1) endif; endfunction;
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Limites RecursividadeDe notar que para prevenir os ciclos infinitos, o Octave tem uma varivel prdefinida, max_recursion_depth, que limita o nmero de chamadas recursivas de uma funo.Por omisso (default), o valor da varivel 256, pelo que no se pode calcular fact(260) sem alterar o valor da varivel.
Existem vrias outras funes recursivas em que pode existir mais do que um elemento base ou em que o conjunto recursivo mais difcil de definir. Em qualquer caso essencial definir a condio de terminao.Para exemplificar estas funes, estudamos de seguida a determinao dos nmeros de Fibonacci e o clculo do maior divisor comum entre dois nmeros.
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Funo Fibonacci (Recursiva)Fibonacci (matemtico da Renascena italiana) estabeleceu uma srie curiosa de nmeros para modelar o nmero de casais de coelhos em sucessivas geraes. Em cada gerao, o nmero pode ser obtido atravs dos das 2 geraes anteriores atravs defib(n) = fib(n-1) + fib(n-2)Assumindo que nas primeiras duas geraes s existe um casal de coelhos, os sucessivos nmeros de Fibonacci so1,1,2,3,5,8,13,21,34,55,89, ...Estes nmeros ocorrem em vrios processos biolgicos (e no s), por exemplo, no nmero de ptalas de algumas flores.A sua determinao recursiva impe o clculo directo do valor para 2 elementos de base (a 1 e a 2 gerao).
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Funo Fibonacci (Recursiva)Em Octave, a obteno dos nmeros de Fibonacci pode ser feita muito facilmente atravs da funo recursiva abaixo (em Octave)
Como fcil de constatar, se o nmero n inicial for maior ou igual a 1, a recurso termina. No entanto, se se chamar fib(0) a computao no termina (em Octave termina quando o nmero de chamadas recursivas exceder o valor da varivel max_recursion_depth)! function f = fib(n); if n == 1 % 1 elemento base f = 1; elseif n == 2 % 2 elemento base f = 1; else % definio recursiva f = fib(n-1) + fib(n-2); endif; endfunction;
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Mximo Divisor Comum (Funo Recursiva)Como se sabe, o mximo divisor comum (mdc) entre dois nmeros m e n tambm um divisor da sua diferena, m-n. Por exemplo, o mdc de 60 e 36 12, que divide 24 = 60-36.Por outro lado, o mdc dos dois nmeros m e n ainda o mdc do menor nmero (n) com a diferena (m-n). Se houvesse um divisor comum maior, ele seria igualmente divisor de n, contrariamente hiptese.Assim, pode determinar-se o mdc de dois nmeros atravs da determinao do mdc de nmeros cada vez menores. A computao termina quando os nmeros forem iguais, caso em que o mdc esse nmero.Por exemplo:60 - 36 = 24 ; 36 24 = 12; 24 12 = 12; 12 = 12 ! % 12 o mdc de 60 e 36
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Mximo Divisor Comum (Funo Recursiva)Em Octave, pode determinar-se o maior divisor comum de dois nmeros com a funo seguinte
De notar que antes da chamada recursiva deve ser verificado qual o maior dos argumentos de entrada (para no se chamar a funo com argumentos negativos!)function d = mdc(m,n); if m == n d = m; elseif m > n d = mdc(m-n,n); else d = mdc(n-m,m); endif;endfunction;
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Recurso e IteraoUma funo definida recursivamente pode ser igualmente definida de uma forma iterativa (atravs de ciclos). Em geral, a definio recursiva mais declarativa na medida em que explicita o que se pretende obter e no a forma como se obtm (ou seja, um determinado programa que usado).Por outro lado, uma definio iterativa, embora no permita uma compreenso to imediata, geralmente mais eficiente, j que as instrues de programao de baixo nvel para a iterao so mais eficientes que as de chamadas de funes.
No entanto, estas diferenas so geralmente pouco importantes, excepto em casos de recurso mltipla, em que a ineficincia pode ser catastrfica.function f = fact_ite(n); f = 1; for i = n:-1:1 f = f * i; endif;endfunction;function f = fact_rec(n); if n == 1 f = 1 else f = n * fact_rec(n-1); endif;endfunction;
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Recurso e IteraoEsta a situao da funo de Fibonacci, em que o seu valor depende de 2 chamadas recursivas. Como as chamadas so independentes, a mesma funo acaba por ser recalculada vrias (muuuuu...itas !) vezes.Na realidade, o nmero de funes chamadas o prprio nmero de fibonacci (7/1, 6/1, 5/2, 4/3, 3/5, 2/8) que aumenta exponencialmente com o valor de n.
function f = fib(n); if n
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Recurso e IteraoPara se ter uma ideia do aumento, podemos notar que apesar de inicialmente pequenos
os nmeros tornam-se rapidamente grandes !!!
ou mesmo enormes !!!
tornando proibitiva a sua computao recursiva (normal).
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
Sheet1
n1234567891011
fib(n)1123581321345589
Sheet2
Sheet3
Sheet1
n26272829303132
fib(n)12139319641831781151422983204013462692178309
Sheet2
Sheet3
Sheet1
n4647484950
fib(n)183631190329712150734807526976777874204912586269025
Sheet2
Sheet3
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*MemorizaoPor vezes possvel aliar a declaratividade da verso recursiva, com a eficincia da verso iterativa, atravs da memorizao dos valores j computados. Por exemplo se se pretenderem os primeiros 100 nmeros de fibonacci, pode criar-se um vector, fib_vec, com os valores j determinados. Se fib_vec(n) ainda no contiver o valor de fib(n), ento determina-se fib(n) e regista-se esse valor em fib_vec(n).Caso contrrio, retorna-se simplesmente o valor de fib_vec(n).Para que este esquema seja posvel, necessrio que a tabela fib_m seja visvel por todas as instncias da funo fib(n). Para evitar pass-la como parmetro deve declarar-se como uma varivel global.Em Octave, para que uma varivel seja global, ela deve ser declarada no programa principal com a declarao global. No caso actual, se se pretende um vector linha com 100 elementos inicializados a zero, devemos declarar a varivel globalglobal fib_vec = zeros(1,100)
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*AleatoriedadeEm muitas aplicaes informticas, nomeadamente em simulaes que utilizam processos aleatrios ou estocsticos, muito utilizadas em engenharia.Um processo aleatrio aquele cujo resultado no conhecido com rigor, mas que obedece a uma distribuio de probabilidades. Por exemplo, no lanamento de uma moeda ao ar, no se conhece o resultado a priori, mas, se a moeda no estiver viciada, assume-se que cerca de 50% das vezes sai cara, enquanto que nas outras cerca de 50% de vezes sai coroa. J o nmero de vezes que no lanamento de um dado sai um 2 de 1/6 (ou 16.66%).Tais processos podem ser simulados com recurso a nmeros (pseudo-) aleatrios, conhecidos como processos ou simulaes de Monte Carlo.Estes nmeros so obtido por um gerador de nmeros aleatrios, que no caso do Octave invocado pela funo pre-definida rand(), ou simplesmente rand.Esta funo retorna um nmero aleatrio entre no intervalo [0, 1[ de cada vez que invocada.
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Exemplos: Moeda ao ar e Lanamento de um DadoPor exemplo o processo de n lanamentos de uma moeda ao ar, em que 1 significa caras e 2 significa coroas, pode ser simulado pela funo
J o lanamento de dados pode ser simulado pela funofunction L = moeda(n); for i = 1:n if rand > 0.5 L(i) = 1 else L(i) = 2 endif end forendfunctionfunction L = dado(n); for i = 1:n r = rand; if r < 1/6 L(i) = 1; elseif r < 2/6 L(i) = 2; ... elseif r < 5/6 L(i) = 5 else L(i) = 6 endif end forendfunction
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Exemplos: Moeda ao ar e Lanamento de um DadoNa realidade, para grandes nmeros a frequncia aproxima-se da probabilidade, isto , se lanarmos 10 vezes uma moeda ao ar, o nmero de caras deve ser prximo de 5, pois a probabilidade de sair caras e *10 = 5.Em geral a frequncia de ocorrrncia de um valor aleatrio aproxima-se da sua probabilidade para grandes valores de n. Mais formalmente, denotando por p(X=a) ou simplesmente pa, a probabilidade de um evento X tomar o valor A;n o nmero de eventos eea o valor esperado do nmero de ocorrncias de X=afa o nmero efectivo de ocorrncias de X=a temosea = n*pa ; e fa ea, devendo o erro relativo (n) = ( fa ea)/ n diminuir com o aumento do nmero de eventos.
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Passeio AleatrioExemplo: Uma pessoa pretende percorrer um passeio entre as duas vias de uma estrada, em que comeando no centro do passeio, pode guinar at k vezes para a direita ou a esquerda antes de sair do passeio e ser atropelada. Estando bbada, em cada passo que d tem uma probabilidade de 50% de guinar para a direita .e outra igual de guinar para a esquerda. Sabendo-se que dever dar n passos, qual a probabilidade de chegar ao fim da estrada sem sair do passeio?Para resolver este problema, basta utilizar a funo passeio, que para um nmero total de percursos de n passos num passeio que admite k desvios, conta o nmero na de atropelamentos.
Naturalmente a funo passeio utiliza uma funo atropelado que deve retornar 1 se houver atropelamento e 0 no caso contrrio.function p = passeio(n,k,total); na = 0; for i = 1:total na = na + atropelado(n,k); endfor p = na/totalendfunction
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*Passeio AleatrioPara a funo atropelado, vamos considerar uma varivel desvio, que comea em 0 e vai acumulando os desvios para a direita e para a esquerda.Se conseguir chegar ao fim do ciclo for sem atingir um desvio, em mdulo, maior que k, a funo retorna 0. De notar que logo que o desvio seja maior que k, a funo pode retornar imediatamente o valor 1, saindo do ciclo for com a instruo de excepo return.function p = atropelado(n,k); p = 0; desvio = 0; for i = 1:n if rand > 0.5 d = 1; else d = -1; endif; desvio = desvio + d; if abs(desvio) > k p = 1; return; endif endforendfunction
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*rea de uma CurvaOs numeros aleatrios tambm podem ser utilizados na determinao aproximada de reas. O raciocnio o seguinte:Contornemos a rea a determinar A, por uma rea conhecida, BConsideremos um conjunto aleatrio de pontos na rea conhecida, e contabilizar a percentagem p de pontos que cai dentro da rea a determinar.A rea A pode ser aproximada por A pB .Exemplo:Calculemos a rea do de circulo de raio 1 ao lado.A rea B naturalmente de 1A rea do de circulo deve ser prxima de /4Falta determinar a forma de gerar pontos aleatrios no quadrado, o que se pode fazer facilmente gerando x e y aleatrios no intervalo [0,1[ e verificando se ficam abaixo da funo y = sqrt(1-x2)
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
2 Abril 2008Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo*rea de uma CurvaEste algoritmo est implementado na funo pi_prob abaixo indicada. O ciclo for gera n pontos , Destes n pontos , c esto abaixo da curva do crculo.A rea do de crculo a fraco c/n da rea do quadrado (1*1)O valor de pi 4 vezes a reafunction p = pi_prob(); c = 0; for i = 1:n; x = rand(); y = rand(); if y < sqrt(1-x^2) c = c+1; endif endfor area = (1*1)* c/n; p = 4*area;endfunction
Recursividade Funes Recursivas. Aleatoriedade e Processos de Monte Carlo
**********************