Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Introdução à Recursão: Conceitos, Implementação e Exemplos, Resumos de Autômatos e Teoria da Complexidade

Uma introdução abrangente ao conceito de recursão em programação, cobrindo definições recursivas, implementação, tipos de recursão (aninhada e indireta), e comparação com iteração. são apresentados exemplos práticos de funções recursivas, como o cálculo do fatorial e da sequência de fibonacci, facilitando a compreensão do assunto. O texto também discute as vantagens e desvantagens da utilização de recursão em diferentes cenários.

Tipologia: Resumos

2025

Compartilhado em 29/04/2025

eliza-leal-suzano
eliza-leal-suzano 🇧🇷

5 documentos

1 / 46

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
DESCRIÇÃO
Conceitos introdutórios às definições recursivas, tais como sequências, funções, conjuntos;
Implementação da recursividade; Recursividade aninhada e Recursão indireta; Comparação entre
a iteração x recursividade e Exemplos de funções recursivas.
PROPÓSITO
Apresentar os conceitos básicos para o entendimento das definições recursivas, diferenciar
algoritmos interativos dos recursivos e identificar os problemas que podem ocorrer ao se empregar
algoritmos recursivos.
PREPARAÇÃO
Antes de iniciar o conteúdo, tenha à mão um livro de Matemática do Ensino Médio que apresente
os conceitos de funções matemáticas, como fatorial, somatórios, teoria de conjuntos, sequências e
séries. Preferencialmente, também tenha um computador com um ambiente para compilar e
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e

Pré-visualização parcial do texto

Baixe Introdução à Recursão: Conceitos, Implementação e Exemplos e outras Resumos em PDF para Autômatos e Teoria da Complexidade, somente na Docsity!

DESCRIÇÃO

Conceitos introdutórios às definições recursivas, tais como sequências, funções, conjuntos; Implementação da recursividade; Recursividade aninhada e Recursão indireta; Comparação entre a iteração x recursividade e Exemplos de funções recursivas.

PROPÓSITO

Apresentar os conceitos básicos para o entendimento das definições recursivas, diferenciar algoritmos interativos dos recursivos e identificar os problemas que podem ocorrer ao se empregar algoritmos recursivos.

PREPARAÇÃO

Antes de iniciar o conteúdo, tenha à mão um livro de Matemática do Ensino Médio que apresente os conceitos de funções matemáticas, como fatorial, somatórios, teoria de conjuntos, sequências e séries. Preferencialmente, também tenha um computador com um ambiente para compilar e

executar programas escritos na linguagem de programação C.. Para que você possa acompanhar melhor os exemplos, baixe os arquivos com os exemplos apresentados clicando aqui.

OBJETIVOS

MÓDULO 1

Definir recursividade

MÓDULO 2

Identificar as situações de uso da recursividade

MÓDULO 3

Identificar a utilização de funções recursivas através de exemplos

INTRODUÇÃO

A recursividade é uma ferramenta poderosa para resolução de diversos problemas na computação. Alguns, que seriam solucionados com algoritmos complexos e difíceis de entender, conseguem ser resolvidos de forma elegante e bem mais simples.

A partir do momento que se entende a definição recursiva de um algoritmo, a sua implementação se torna bastante simples. Alguns pontos, porém, devem ser considerados para a implementação de algoritmos recursivos, por exemplo, a grande utilização da pilha da memória do computador, levando a estouros da capacidade de memória. É fundamental, portanto, testar os limites dos valores a serem inseridos nesses algoritmos e entender em que tipos de aplicações devemos utilizar funções recursivas ou programas iterativos.

SÃO DETERMINADOS EM TERMOS DOS CASOS

ANTERIORES.

Segundo Oliveira (2020), a recursão pode ser usada para definir sequência de objetos, funções de objetos e conjuntos.

SEQUÊNCIAS

De acordo com Vidal (2020), uma sequência é uma lista de objetos, enumerados, segundo uma ordem. O denota o késimo elemento da sequência. Uma sequência recursiva explicita seu primeiro valor (ou primeiros valores) e define outros valores na sequência em termos dos valores iniciais.

Utilizando definição:

Passo 1 - o elemento base indica que

Passo 2 - o passo recursivo 2 é apresentado com

Passo 3 - o passo recursivo 3 é apresentado como

A seguir, alguns exemplos de sequências recursivas:

SEQUÊNCIA DE POTÊNCIAS DE 2:

No entanto, uma sequência também pode ser definida de forma recursiva.

A partir do 1º termo e de uma regra para encontrar um termo da sequência a partir do anterior, ou seja:

gerando a seguinte sequência:

S ( K )

S (1)= 2

S(2) = S(1) * 2

S(3) = S(2) * 2

an^ = 2n, para n = 0; 1; 2; 3; 4

a^0 = 1

an+1^ = 2. an, para n = 0; 1; 2; 3

S (0) = 1

SEQUÊNCIA ARITMÉTICA T:

Esta sequência é recursiva, ou seja, a sequência dos termos é obtida a partir do 1º termo.

 ATENÇÃO

É importante ressaltar que quando definimos uma sequência recursivamente, podemos usar indução para provar resultados sobre ela. Nos exemplos anteriores, foi utilizada, como recurso, a indução para se obter o próximo valor da sequência recursiva.

FUNÇÕES

S (1) = 2. S (0) = 2

S (2) = 2. S (1) = 4

S (3) = 2. S (2) = 8

T(1) = 1

T(n) = T(n − 1) + 3 para n ≥ 2

T (1) = 1

T (2) = T (1) + 3 = 1 + 3 = 4

T (3) = T (2) + 3 = 4 + 3 = 7

T (4) = T (3) + 3 = 7 + 3 = 10

T (5) = T (4) + 3 = 10 + 3 = 13

Exemplo 3: Encontre , e se é definida recursivamente por: ; para para a função:

Solução:

EXEMPLOS DE FUNÇÕES COMO DEFINIÇÕES

RECURSIVAS

A função fatorial é um exemplo clássico da definição recursiva, pela própria definição do fatorial de um número N ser o fatorial do número

multiplicado pelo fatorial do número menos

, e assim, sucessivamente.

Pela definição matemática:

O fatorial do inteiro 5 é calculado da seguinte forma:

f( 1 ) = 2f(0)^ = 2^1 = 2

f( 2 ) = 2f(1)^ = 2^4 = 16

f( 3 ) = 2f(2)^ = 2^16 = 65536

f( 4 ) = 2f(3)^ = 2^45 = 35184372088832

f(1) f(1) f(3) f(n) f(0) = 1

n = 0, 1, 2, 3, 4 f(n + 1) = f(n)^2 + f(n) + 1

f(0) = 1

f(1) = f(0)^2 + f(0) + 1 = 1^2 + 1 + 1 = 3

f(2) = f(1)^2 + f(1) + 1 = 3^2 + 3 + 1 = 13

f(3)= f(2)^2 + f(2) + 1 = 13^2 + 13 + 1 = 183

f(4) = f(3)^2 + f(3) + 1 = 183^2 + 183 + 1 = 33673

(n)

1 (n − 1)

Utilizando a definição recursiva para funções, temos o seguinte resultado:

Solução: Definição recursiva:

Avaliando para o caso

INDUÇÃO MATEMÁTICA

O princípio da indução matemática garante que funções definidas recursivamente ficam bem definidas.

Considerando que, para todo inteiro positivo, o valor da função neste inteiro é determinado de forma não ambígua, ou seja, obtemos o mesmo valor qualquer que seja o modo de aplicar as duas partes da definição.

Segundo Freitas (2020), em algumas definições, os valores da função nos primeiros k inteiros positivos são especificados. E então é fornecida uma regra para determinar o valor da função em inteiros maiores a partir dos seus valores em alguns ou todos os inteiros que o precedem.

O princípio da indução forte garante que tais definições produzem funções bem definidas. Nos exemplos do fatorial para funções e sequências, são fornecidas as regras que levam a indução para os restantes dos valores aplicados à função.

F(0) = 1

F(n + 1) = (n + 1)F(n)

F(5) = 5! :

F(5) = 5. F (4)

F(4) = 5. 4. F (3)

F(3) = 5. 4. 3. F(2)

F(2) = 5. 4. 3. 2. F (1)

F (1) = 5. 4. 3. 2. 1. F (0)

F(0) = 5. 4. 3. 2. 1. 1 = 120

Frequentemente, os elementos de uma sequência são definidos através de padrões regulares, como uma função de sua posição na sequência.

O somatório é denotado por meio da notação:

Atenção! Para visualização completa da equação utilize a rolagem horizontal

Em que:

é o índice do somatório.

é uma variável indexada que representa cada termo do somatório.

é o índice inicial (ou limite inferior).

é o índice final (ou limite superior).

Segundo Peternelli (2020), a expressão sob o símbolo de somatório significa que o índice i começa igual a m. Este é incrementado em uma unidade a cada termo subsequente, terminando quando.

Número de termos do somatório:

É uma forma de se descobrir a quantidade de itens que serão executados na definição recursiva.

Atenção! Para visualização completa da equação utilize a rolagem horizontal

O número de termos da expressão resultante será dado por , onde:

é o número de termos do somatório expandido.

é o índice final (ou limite superior).

é o índice inicial (ou limite inferior).

ni = m xi = xm + xm +1 + xm +2+... + xx −1 + xn

i

xi

m

n

i = m

i = n

n i = m xi

t = n + 1 – m – r

t

n

m

é o número de restrições as quais o intervalo [m,n] está submetido.

O número de termos da expressão resultante terá:

, ou seja, 5 termos:

Atenção! Para visualização completa da equação utilize a rolagem horizontal

CONJUNTOS

Os conjuntos são uma estrutura que possui elementos finitos e desordenados.

As sequências e as funções possuem uma sequência de objetos ordenados.

De acordo com Vidal (2020), certos conjuntos podem ser definidos recursivamente, por exemplo, os ancestrais de um ser vivo:

Os pais de um ser vivo são seus ancestrais.

Todo pai de um ancestral também é um ancestral.

As definições recursivas de conjuntos também têm duas partes:

PASSO BÁSICO

PASSO RECURSIVO

PASSO BÁSICO:

r

t = n + 1 – m – r = 5 + 1 – 1 – 0

∑ 5 i =1 2 i^ = 2(1)+2(2)+2(3)+2(4)+2(5)= 2 + 4 + 6 + 8 + 10

Definições recursivas são muito importantes no estudo de strings (Uma cadeia de caracteres) , pois estas são composições de outras strings. Uma string sobre um alfabeto c forma uma sequência finita de símbolos de

O conjunto de strings sobre o alfabeto pode ser definido por:

Passo básico: (contém a string vazia).

Passo recursivo: Se e então

O passo recursivo estabelece que:

Novas strings são produzidas pela adição de um símbolo de ao final das strings já em .

A cada aplicação do passo recursivo, são geradas strings contendo um símbolo a mais.

Exemplo: se

é o conjunto de todas as strings de bits.

Strings que estão em :

;

0 e 1 (primeira aplicação do passo indutivo).

00, 01, 10, 11 (segunda aplicação passo indutivo).

UMA CADEIA DE CARACTERES

w ϵ ∑ * x ϵ ∑, wx ϵ ∑ *.

∑ = f {0; 1 }:

ENTENDENDO A RECURSIVIDADE

VERIFICANDO O APRENDIZADO

1. A DEFINIÇÃO RECURSIVA É MUITO IMPORTANTE PARA A RESOLUÇÃO

DE DIVERSOS PROBLEMAS MATEMÁTICOS. QUAIS AFIRMAÇÕES A SEGUIR

ESTÃO CORRETAS EM RELAÇÃO A UMA DEFINIÇÃO RECURSIVA?

são determinados em termos dos novos casos inseridos pelo usuário.

III. Uma base para determinação de casos simples do item.

A alternativa "D " está correta.

A II não retrata a estratégia da definição recursiva que executa em termos dos valores passados inicialmente para a função.

2. O algoritmo é executado utilizando a seguinte fórmula recursiva: fn = fn-1 + fn-2. Considerando que f(0) = 0 e f(1) = 1, indique qual série está correta para f(7):

A alternativa "B " está correta.

f(0) = 0

f(1) = 1 F(2) = f(1) + f(0) = 1 + 0 = 1 f(3) = f(2) + f(1) = 1 + 1 = 2 f(4) = f(3) + f(2) = 2 + 1 = 3 f(5) = f(4) + f(3) = 3 + 2 = 5 f(6) = f(5) + f(4) = 5 + 3 = 8 F(7) = f(6) + f(4) = 8 + 5 = 13

Portanto, a sequência correta é: 0, 1, 1, 2, 3, 5, 8, 13.

MÓDULO 2

Identificar as situações de uso da recursividade

RECURSÃO

A recursividade é uma característica encontrada em diversas linguagens de programação, como: C, Java, Python, C++, entre outras.

Uma função recursiva é adequada para resolver problemas matemáticos com definições recursivas, conforme apresentado anteriormente, tais como: Fatorial, série de Fibonacci, problemas com conjuntos e sequência de valores.

Atualmente, a recursividade se torna bastante importante, pois é a base para a programação dinâmica e para linguagens com paradigma funcional, que são úteis para resolução de problemas computacionais bastante complexos.

Segundo Costa (2020), as funções recursivas são, em sua maioria, soluções mais elegantes e simples, se comparadas a funções tradicionais ou iterativas, pois executam tarefas repetitivas sem utilizar nenhuma estrutura de repetição − como for ou while.

Entretanto, essa elegância e simplicidade têm um preço que requer muita atenção em sua implementação.

O QUE É RECURSÃO?

Recursão é um método de resolução que envolve quebrar um problema em subproblemas menores e menores, até chegar a um pequeno o suficiente para que possa ser resolvido trivialmente.

Normalmente, recursão envolve uma função que chama a si mesma. Conforme explicado por Miller e Ranum (2020), essa estratégia é chamada de dividir para conquistar e é utilizada em boa parte dos algoritmos.

Isso porque a recursão permite escrever soluções elegantes para problemas que, de outra forma, podem ser muito difíceis de programar.

 COMENTÁRIO

Os problemas computacionais, com definições recursivas, são resolvidos de forma bem mais simples que de forma iterativa.

RESOLUÇÃO ITERATIVA DO FATORIAL

Conforme explica Costa (2020), para a mesma definição matemática de fatorial mencionada anteriormente, pode-se utilizar uma implementação iterativa, ou seja, utilizando comandos de repetição como: Repita, enquanto e para.

A seguir, é apresentada uma versão iterativa para o algoritmo fatorial.

função fatorial (n: inteiro): inteiro var n, aux : inteiro inicio aux = 1 para i de 1 até n faça aux = aux * n fim_para fatorial = aux fim

Figura 3 ‒ Implementação fatorial iterativo. Fonte: EnsineMe.

Na linha (4), é criada uma variável aux para o armazenamento dos valores do fatorial. Na linha (5), é criado o loop para calcular o fatorial a partir do valor 1 até o n.

Esse valor é armazenado na variável aux. Na linha (8), o fatorial recebe o valor da variável aux. Comparando as duas versões, percebe-se que o algoritmo recursivo é mais intuitivo, pois implementa diretamente a definição recursiva do fatorial.

Outro ponto importante, para se indicar a utilização de recursividade, é quando há necessidade de guardar em pilha os estados intermediários para resolução de um problema, como visitar os nós de uma árvore binária ou um algoritmo de ordenação.

AS TRÊS LEIS DA RECURSÃO

De acordo com Miller e Ranum (2020), para se implementar um algoritmo recursivo completo, devem ser obedecidas três leis importantes:

LEI 1

Um algoritmo recursivo deve ter um caso básico.

LEI 2

Um algoritmo recursivo deve mudar o seu estado e se aproximar do caso básico.

LEI 3

Um algoritmo recursivo deve chamar a si mesmo, recursivamente.

LEI 1

Um caso básico é o ponto onde a função será encerrada, e é geralmente um limite superior ou inferior da regra geral da definição recursiva da função. Esse limite é um problema suficientemente pequeno para resolver diretamente. No caso do fatorial, o caso básico é valor do fatorial do número 0, que é definido como 1.

LEI 2

Para se atender à segunda lei, deve-se haver mudança de estados para que aproxime o algoritmo do caso básico apresentado na lei 1. Para haver a mudança, os dados devem ser alterados para reduzir o problema de alguma forma, utilizando a estratégia do dividir para conquistar, conforme mencionado anteriormente. No caso do fatorial, a progressão natural do problema será diminuir o valor do número a ser calculado o fatorial. Então, o valor será diminuído em uma unidade ( ).

LEI 3

É a chamada do algoritmo a si mesmo, considerando a própria definição. No caso do fatorial, é chamado da função fatorial com uma unidade a menos ( ), até a finalização do

n – 1

fatorial (n − 1)