Commit 1c497909 authored by Jomaro Rodrigues's avatar Jomaro Rodrigues

Closes #15

parent 0f3f0cba
......@@ -69,7 +69,7 @@
\subfile{modulos.tex}
%\subfile{recursividade.tex}
\subfile{recursividade.tex}
\backmatter
......
......@@ -2,38 +2,43 @@
\begin{document}
\chapter{RECURSIVIDADE}
\chapter{Recursividade}
\emph{Recursividade} é uma técnica de programação que envolve utilizar definições recursivas de modo a simplificar vários algoritmos.
Recursividade é uma técnica de programação que envolve utilizar definições recursivas de modo a simplificar vários algoritmos.
Uma definição recursiva é uma definição que utiliza a si mesma para se definir. A princípio, a ideia
pode parecer confusa e obscura, mas na realidade é um conceito relativamente simples.
Por exemplo, é possível definir uma exponenciação dessa maneira:
Seja n, k \in N,
Seja $n, k \in N$,
n^0 = 1
$$n^0 = 1$$
n^k = n.n^{k-1}
$$n^k = n.n^{k-1}$$
Observe que, no exemplo acima, a exponenciação n^k está sendo definida através de
uma outra exponenciação (n^{k-1}), ou seja, este é um caso em que a exponenciação
Observe que, no exemplo acima, a exponenciação $n^k$ está sendo definida através de
uma outra exponenciação $(n^{k-1})$, ou seja, este é um caso em que a exponenciação
é definida através dela mesma (o que é uma definição recursiva ou também chamada de recorrência).
Analisando um pouco melhor o exemplo acima, n^{k-1} também é uma exponenciação,
Analisando um pouco melhor o exemplo acima, $n^{k-1}$ também é uma exponenciação,
portanto poderia utilizar a mesma definição para se definir, ou seja, se tomamos
n^{k-1} = n.n^{k-2} e assim podemos definir, n^{k-3}, etc.
$n^{k-1} = n.n^{k-2}$ e assim podemos definir, $n^{k-3}$, etc.
Note que deveria haver um momento em que a definição termina, pois senão seria
impossível calcular n^k. Por isso, toda definição recursiva deve ser acompanhada
de um caso trivial que será o final da definição. No exemplo apresentado, n^0 = 1
é o caso trivial e determina o final da recursividade sobre n^k.
impossível calcular $n^k$. Por isso, toda definição recursiva deve ser acompanhada
de um caso trivial que será o final da definição. No exemplo apresentado, $n^0 = 1$
é o caso trivial e determina o final da recursividade sobre $n^k$.
Assim, seria possível calcular, por exemplo 3^3:
Assim, seria possível calcular, por exemplo $3^3$:
3^3 = 3.3^2, 3^2 = 3.3^1, 3^1=3.3^0, 3^0 = 1 \Rightarrow 3^1 = 3.1, 3^2 = 3.3, 3^3 = 3.3.3
\begin{align}
3^3 &= 3.3^2,
3^2 &= 3.3^1,
3^1 &= 3.3^0,
3^0 &= 1 \Rightarrow 3^1 = 3.1, 3^2 = 3.3, 3^3 = 3.3.3
\end{align}
Na linguagem C, funções podem chamar a si próprias, ou seja, funções podem ser recursivas também,
já que podem ser definidas através delas mesmas.
......@@ -41,25 +46,30 @@ já que podem ser definidas através delas mesmas.
Para uma linguagem permitir recursividade, uma função deve estar apta a chamar a si própria. Um
êxemplo clássico de recursividade em programação é a função que calcula o fatorial de um número.
\begin{lstlisting}
-Exemplo 1: Duas versões de fatorial -
Exemplo 1: Duas versões de fatorial
\begin{lstlisting}
/* não recursiva */
int fat (int n)
int fat(int n)
{
int t, resp;
resp = 1;
for (t = 1; t <= n; t++)
resp = resp*t;
return resp;
}
/* recursiva */
int fat (int n)
int rfat (int n)
{
int resp;
if (n < 2) return 1;
resp = fat(n-1)*n;
resp = rfat(n-1)*n;
return resp;
}
\end{lstlisting}
......@@ -70,11 +80,11 @@ acumulado.
A operação da função fat recursiva é um pouco mais complexa. Quando a função \emph{fat} é chamada
com um argumento 1, a função retorna 1 (esse é o caso trivial da definição recursiva do fatorial), caso
contrário, ela retorna o produto de \emph{fat(n-1)*n}.
contrário, ela retorna o produto de $fat(n-1)*n$.
Para avaliar essa expressão, fat é chamada com n-1. Isso acontece até que n seja igual a 1, quando as
chamadas à função começam a retornar. O exemplo abaixo ilustra a configuração da pilha na memória
durante cada passo da sequ^encia de execução da função \emph{fat(4)}.
durante cada passo da sequência de execução da função \emph{fat(4)}.
% FIXME: Inserir a imagem
......@@ -87,7 +97,7 @@ Quando cada chamada recursiva retorna, as antigas variáveis locais e os parâme
pilha e a execução recomeça no ponto de chamada da função dentro da função.
A principal vantagem das funções recursivas é que elas podem ser usadas para criar versões mais claras
ê mais simples de muitos algoritmos complexos do que os seus equivalentes iterativos.
e mais simples de muitos algoritmos complexos do que os seus equivalentes iterativos.
Por exemplo, o algoritmo de ordenação rápida é bastante difícil de ser implementado pelo modo
iterativo. Também, alguns problemas, especialmente os relacionados com IA (inteligência artificial),
......@@ -103,15 +113,19 @@ de chamar a si mesma, o programa certamente irá entrar estourar a pilha, já qu
1. Crie uma definição recursiva para as seguintes operações:
a) soma de dois números a e b;
b) multiplicação de dois números a e b ;
c) cálculo do n-ésimo número de uma PA de razão r;
d) cálculo do n-ésimo número de uma PG de razão q;
2. Implemente a função soma_pa (int x, int r, int n) que retorna a soma dos n termos de uma PA de
2. Implemente a função soma\_pa (int x, int r, int n) que retorna a soma dos n termos de uma PA de
termo inicial x e razão r.
3. Desenhe um diagrama da memória para a seguinte chamada de soma_pa:
\begin{verbatim}
soma pa(1,3,4):
\end{verbatim}
3. Desenhe um diagrama da memória para a seguinte chamada de soma\_pa:
\begin{lstlisting}
int soma_pa(1,3,4):
\end{lstlisting}
\end{document}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment