Você está na página 1de 17

Universidade Tuiuti do Paraná

Curso de Tecnologia em Análise e Desenvolvimento de Sistemas


Professor Diógenes Furlan

Lógica de Programação 2
Módulo 1

2011
Professor Diógenes Furlan Lógica de Programação 2 2

REVISÃO de VETORES e MATRIZES

1) Ler um vetor W de 10 elementos, depois ler um valor V. Contar e escrever quantas vezes o valor V
ocorre no vetor W e escrever também em que posições (índices) do vetor W o valor V aparece. Caso o
valor V não ocorra nenhuma vez no vetor W, escrever uma mensagem informando isto.

2) Ler um vetor D de 10 elementos. Criar um vetor E, com todos os elementos de D na ordem inversa, ou
seja, o último elemento passará a ser o primeiro, o penúltimo será o segundo e assim por diante.
Escrever todo o vetor D e todo o vetor E.

3) Fazer um algoritmo/programa que leia dois vetores (A e B) de 10 posições de números inteiros. O


programa deve, então, subtrair o 1º elemento de A do último de B, acumulando o valor, subtrair o 2º
elemento de A do penúltimo de B, acumulando o valor, e assim por diante. Mostrar o resultado da soma
final.

4) Ler um vetor de 10 elementos inteiros. Após isto, imprimir na tela os 10 valores lidos e o usuário poderá
escolher um destes valores para ser excluído do vetor. Ler o valor escolhido e eliminá-lo do vetor. No
momento da exclusão todos os valores posteriores ao valor escolhido deverão ser reorganizados
(movidos uma posição para esquerda) a fim de que o vetor resultante não fique com um espaço em
branco. Imprimir o novo vetor.

5) Escrever um algoritmo que leia um vetor K (15) e o escreva. Criar, a seguir, um vetor P que contenha
todos os números primos de K. Escrever o vetor P.

6) Fazer um algoritmo que leia 100 números inteiros, distribua os números lidos em dois vetores, sendo um
para pares e outro para ímpares, e escreva os vetores.

7) Fazer um algoritmo que leia um conjunto de 30 valores numéricos inteiros e distribua-os entre dois
vetores, separando os números positivos dos negativos. Os vetores devem ter 30 posições cada. Mostrar
os vetores ao final do processamento.

8) Fazer um algoritmo que leia uma matriz 5 x 5 de números reais, encontre o maior valor da matriz e, a
seguir, multiplique cada elemento da diagonal principal pelo maior valor. Mostrar a matriz após as
multiplicações.

9) Fazer um algoritmo que leia uma matriz 5 x 5 de números reais e, a seguir, multiplique cada linha pelo
elemento da diagonal principal daquela linha. Mostrar a matriz após as multiplicações.

10) Fazer um algoritmo que leia uma matriz 5 x 5 de números inteiros, calcule a média dos elementos do
triângulo inferior e mostre o resultado.
11) Na teoria dos sistemas, define-se como elemento minimax de uma matriz o menor elemento da linha
onde se encontra o maior elemento da matriz. Escrever um algoritmo que leia uma matriz 10x10 de
inteiros e encontre seu elemento minimax, mostrando também sua posição.
Professor Diógenes Furlan Lógica de Programação 2 3

Módulos

A Programação Estruturada é hoje o resultado de uma série de estudos e propostas de disciplinas e


metodologias para o desenvolvimento de software. Conceitos associados, como técnica de
refinamentos sucessivos e modularização de programas, integram o ferramental para elaboração
de programas visando, principalmente, os aspectos de confiabilidade, legibilidade, manutenção e
flexibilidade.

A metodologia de refinamentos sucessivos parte do princípio de que resolver um problema


complexo é mais fácil se não precisarmos considerar todos os aspectos do problema
simultaneamente, isto é, a decomposição de um problema grande numa série de subproblemas
mais simples.

Quando no processo de desenvolvimento do algoritmo faz-se a opção por divisão do


algoritmo, este procedimento conduz a modularização da solução do problema.

Um módulo é então um grupo de comandos, constituindo um trecho de algoritmo, com


uma função bem definida. Esta divisão da atividade de programação permite que, a cada instante,
toda a atenção do programador esteja concentrada na solução de cada problema específico e bem
definido. Da mesma forma, pode-se verificar a correção do algoritmo por etapas analisando-se a
correção de cada módulo.

A decisão pela divisão do algoritmo em módulos traz benefícios como:

o maior flexibilidade e facilidade de manutenção, já que o módulo pode esconder dos


outros módulos detalhes que só interessam a ele;
o permite a divisão de tarefa em uma equipe, onde cada módulo pode ser
desenvolvido por um programador diferente;
o facilita o teste, porque cada módulo pode ser testado individualmente, e depois ser
incorporado ao conjunto;
o facilita o projeto, na medida em que permite a abstração.

A experiência recomenda que os módulos constituintes de um programa devam ter no


máximo o tamanho de uma página de listagem. Módulos maiores são difíceis de ser compreendidos
e em geral são multifuncionais.

Outro aspecto importante que envolve a modularização, em particular a modularização de


dados, é a possibilidade de cada módulo poder definir as suas estruturas de dados próprias,
suficientes e necessárias apenas para atingir o objetivo final do módulo. Este aspecto disciplina e
impõe restrições à utilização das estruturas de dados do algoritmo. Toda a comunicação entre
módulos deverá ser bem definida através de vínculos entre os mesmos.

Um bom algoritmo deve procurar reduzir a interação entre módulos (acoplamento) e


aumentar o relacionamento dos elementos de um mesmo módulo (coesão).
Professor Diógenes Furlan Lógica de Programação 2 4

As ferramentas de modularização apresentadas são: funções e procedimentos.

Vantagens:

• partes comuns a vários programas ou que se repetem dentro de um mesmo programa,


quando modularizadas em um procedimento, são programadas (e testadas) uma só vez,
mesmo que tenham que ser executadas com variáveis diferentes;
• podem-se constituir bibliotecas de programas, isto é, uma coleção de módulos que podem
ser utilizados em diferentes programas sem alteração e mesmo por outros programadores.
• a modularização dos programas permite preservar na sua implementação os refinamentos
obtidos durante o desenvolvimento dos algoritmos.
• economia no armazenamento, uma vez que o módulo é armazenado uma única vez mesmo
que utilizado em diferentes partes do programa. Permite, também, que, em um
determinado instante da execução do programa, esteja na memória principal apenas o
módulo ou os módulos necessários à execução deste trecho de programa – paginação.

Desvantagens:

• existe um acréscimo de tempo na execução de programas constituídos por módulos, devido


ao trabalho adicional de ativação do módulo.

Resumo:

Usamos módulos para:

• Reutilização: Evitar que certa seqüência de comandos necessária em vários locais de um


algoritmo tenha que ser escrita repetidamente nestes locais;
• Dividir e estruturar um algoritmo em partes fechadas e logicamente coerentes;
• Aumentar a legibilidade de um algoritmo;
Professor Diógenes Furlan Lógica de Programação 2 5

Blocos

Um bloco possui um conjunto de comandos, com a finalidade de criar um contexto para eles. Este
contexto é chamado de escopo. Podemos ter diversos blocos dentro de um algoritmo, inclusive uns
dentro de outros.

Sintaxe:

<declaração de variáveis>;

<lista de comandos>;

Exemplos:

Bloco simples
{
var a;
a = 10;
}

Blocos aninhados
{
{
...
}
...
{
...
{
...
}
...
}
}
Professor Diógenes Furlan Lógica de Programação 2 6

Escopo

Uma variável começa a existir quando o bloco onde ela está contida inicia, e deixa de existir quando
este bloco termina. Isto define uma variável local (ao bloco).

Entretanto, quando temos blocos aninhados, as variáveis declaradas nos blocos exteriores
podem ser acessadas pelos blocos interiores. Isto define uma variável global.

Quando existe um bloco dentro de outro, as variáveis do bloco externo são locais para ele e
globais para os blocos internos. Já as variáveis do bloco interno são locais a ele e são desconhecidas
pelo bloco externo.

Quando existe conflito de nomes (duas variáveis com mesmo nome, sendo uma local e
outra global), vale a definição local, e a global deixa de poder ser acessada (embora continue
existindo).

Exemplo:
{ //[1]
var a
{ //[2]
var b
a = 10; // var global ao bloco [2]
b = 20; // var local ao bloco [2]
}
a = 20;
// b é variável inexistente aqui
}
Professor Diógenes Furlan Lógica de Programação 2 7

Procedimentos

É um bloco com nome, com isto, poderemos chamá-lo em qualquer ponto do algoritmo.

Sintaxe:

void <nome> ( <lista_de_parâmetros_formais> )


{
<declaração de variáveis locais>;
<comandos>;
}

A chamada de um procedimento é apenas a colocação de seu nome em um comando, como se


fosse um novo comando.

Sintaxe:

<nome> ( <lista_de_parâmetros_reais> );

No cabeçalho do procedimento, temos uma série de variáveis, que podem ser de entrada e de
saída. Chamamos estas variáveis de parâmetros FORMAIS. Já as variáveis usadas quando o
procedimento é efetivamente chamado são denominados parâmetros REAIS.

Os parâmetros reais de entrada podem ser variáveis, constantes ou expressões. Já os


parâmetros reais de saída têm que ser variáveis.

Um procedimento pode chamar outros procedimentos dentro dele - procedimentos


aninhados.

Exemplo:
float a,b,r;

void Entrada ( )
{
printf( “\nDigite A e B:”);
scanf (“%f%f”, &A,&B);
}
void Saida ( )
{
printf(“\nO resultado de %f com %f eh = %f “, A,B,R);
}
void main()
{
Entrada();
r = a+b;
Saida();
}
Professor Diógenes Furlan Lógica de Programação 2 8

Exercícios .

1) Modularizar o seguinte programa, criando o


menor número de funções possível: 3) Modularizar o seguinte programa, criando o
menor número de funções possível:
int main()
{ int main()
int i, V[10]; {
int i, A[10], B[5];
for(i=0; i<10; i++)
V[i] = 0; printf(“Entre com 10 numeros: ");
for(i=0; i<10; i++)
for(i=0; i<10; i++) scanf("%d", &A[i]);
printf("%2d ",V[i]);
for(i=0; i<10; i++)
for(i=0; i<10; i++) printf("A[%d]=%d ",i,A[i]);
V[i] += i;
printf("Entre com 5 numeros: ");
for(i=0; i<10; i++) for(i=0; i<5; i++)
printf("%2d ",V[i]); scanf("%d", &B[i]);

for(i=0; i<10; i++) for(i=0; i<5; i++)


V[i] += i; printf("B[%d]=%d ",i,B[i]);
}
for(i=0; i<10; i++)
printf("%2d ",V[i]);
4) Faça um programa que leia 3 vetores A, B e C
getch(); com 100 elementos cada, e monte os vetores
} X, Y e Z, que são respectivamente formados
pela soma de A e B, A e C, e B e C. Escreva o
programa reutilizando o máximo de funções
2) Modularizar o seguinte programa, criando o possível.
menor número de funções possível:

int main()
{
int i, A[10], B[10], C[10];

for(i=0; i<10; i++)


scanf("%d", &A[i]);

for(i=0; i<10; i++)


printf("%2d ",A[i]);

for(i=0; i<10; i++)


scanf("%d", &B[i]);

for(i=0; i<10; i++)


printf("%2d ",B[i]);

for(i=0; i<10; i++)


C[i] = A[i] + B[i];

for(i=0; i<10; i++)


printf("%2d ",C[i]);

getch();
}
Professor Diógenes Furlan Lógica de Programação 2 9

Passagem de Parâmetros

Os parâmetros são canais pelos quais se estabelece uma comunicação bidirecional entre um subalgoritmo e o
algoritmo chamador (o algoritmo principal ou outro subalgoritmo). Dados são passados pelo algoritmo chamador
ao módulo, ou retornados por este ao primeiro por meio de parâmetros.

Têm-se dois tipos de parâmetros: os formais e os reais, conforme apresentados a seguir.

• Parâmetros formais são os nomes simbólicos introduzidos no cabeçalho de módulos, usados na


definição dos parâmetros do mesmo.
• Parâmetros reais são aqueles que substituem os parâmetros formais quando da chamada de um
módulo.

Exemplo:

void calcsoma (int a, int b) // parâmetros formais


{
int z; // variável local
z = a + b;
cout << z;
}

void main()
{
int x, y, w, t; // variáveis locais ao algoritmo principal
Escreva (“Digite dois valores”);
Leia (x, y);
calcsoma(x, y); // parâmetros reais
Escreva (“Digite dois valores novamente”);
Leia (w,t);
calcsoma(w, t); // parâmetros reais
calcsoma(8, 2); // parâmetros reais
}

A passagem de parâmetro ocorre quando é feita uma substituição dos parâmetros formais pelos reais no
momento da execução do módulo. Esses parâmetros são passados por variáveis de duas formas: por valor e por
referência.

Passagem de Parâmetros por Valor - na passagem de parâmetros por valor (ou por cópia) o parâmetro
real é calculado e uma cópia de seu valor é fornecida ao parâmetro formal, no ato da invocação do módulo. A
execução do módulo prossegue normalmente e todas as modificações feitas no parâmetro formal não afetam o
parâmetro real, pois trabalha-se com uma cópia do mesmo.

Por isso parâmetros reais, passados por cópia, podem ser qualquer tipo de expressão.

Exemplo:
int X;
Professor Diógenes Furlan Lógica de Programação 2 10

void main()
{
X = 1;
Escreva (“Antes X = “, X);
proc (X) // X é parâmetro real
Escreva (“Depois X = “, X);
}

void proc (int Y) // Y é parâmetro formal passado por valor


{
Y = Y + 1;
Escreva (“Durante Y = “, Y);
}

O algoritmo acima fornece o seguinte resultado:


Antes X = 1
Durante Y = 2
Depois X = 1
certificando que o módulo não alterou o valor do parâmetro real X durante a sua execução.

Este tipo de ação é possível porque, neste mecanismo de passagem de parâmetros, é feita
uma reserva de espaço em memória para os parâmetros formais, para que neles seja armazenada
uma cópia dos parâmetros reais.

Passagem de Parâmetros por Referência - neste mecanismo de passagem de parâmetros


não é feita uma reserva de espaço em memória para os parâmetros formais. Quando um módulo
com parâmetros passados por referência é chamado, o espaço de memória ocupado pelos
parâmetros reais é compartilhado pelos parâmetros formais correspondentes. Assim, as eventuais
modificações feitas nos parâmetros formais também afetam os parâmetros reais correspondentes.

Por isso parâmetros reais, passados por referência, devem ser variáveis.

Um mesmo módulo pode utilizar diferentes mecanismos de passagem de parâmetros, para


parâmetros distintos. Para diferenciar uns dos outros, convencionou-se colocar o prefixo & antes da
definição dos parâmetros formais passados por referência.

Exemplo:
void proc (int &Y) // Y é parâmetro formal passado por referencia
{
Y = Y + 1;
Escreva (“Durante Y = “, Y);
}
O mesmo algoritmo acima, com o uso de referência, fornece o seguinte resultado:
Antes X = 1
Durante Y = 2
Depois X = 2
Professor Diógenes Furlan Lógica de Programação 2 11

Exercícios .
1) Fazer uma função que troca o valor de duas variáveis inteiras. Então a use para ordenar um
vetor de inteiros.

2) Suponha que a tela seja dividida em regiões de N x P pixels, chamadas de células. Faça uma
função que receba a coordenada atual do mouse por parâmetro e retorne o numero da
célula (linha x coluna) em que o mouse se encontra.

3) Suponha que existe uma variável global que armazena um ponto da tela (coordenada de
linha e coluna). Faça uma função que receba a coordenada atual do mouse por parâmetro e
retorne a distância do mouse a esse ponto.

4) Qual é o erro do seguinte programa?


void inc(int &n)
{
n++;
}
void main()
{
int i;
i = 10;
inc( inc( inc( i )));
cout << i;
}

5) Qual é o valor impresso no seguinte programa?


void f1(int &n, int &m)
{
n = n+m;
}
void main()
{
int a=10,b=10;
f1(a,b); cout << a << b;
f1(a,a); cout << a << b;
}
Professor Diógenes Furlan Lógica de Programação 2 12

Retorno de Valores

Uma função é um bloco que tem um nome e que devolve um resultado. Em outras palavras,
quando não houver retorno de um resultado temos um procedimento, e quando houver, temos
uma função.

Sintaxe:

<tipo_resultado> <nome> ( <lista_parâmetros_formais> )


{
<declaração de variáveis locais>;
<comandos>;
return <resultado>;
}

Toda função usada dentro de um programa deve ter sido definida antes de ser chamada.

Sintaxe:

<variável> ← nome_função ( <parâmetros_reais> );

Exemplo: Seja uma função que calcule o teorema de pitágoras.


real PITAG (real A, real B)
{
X:real;
X ← (A**2) + (B**2);
return X**0.5;
} {PITAG}

void main()
{
W1,W2,RESP: real;
leia (W1,W2):
RESP ← PITAG (W1,W2);
imprima (RESP);
}

Exercícios .
1)

a. Fazer uma função que calcule o quadrado de um número real, recebido por parâmetro
(usando return para devolver o valor).
b. Fazer um programa que mostra o quadrado dos números entre 1 e 50, de 0.5 em 0.5, usando
a função anterior para fazer o calculo.
Professor Diógenes Furlan Lógica de Programação 2 13

2)

a. Fazer uma função que devolva o maior de 2 números fornecidos.


b. Fazer uma função que devolva o maior de 3 números fornecidos, somente usando a função
maior de 2 no seu processamento.
c. Fazer um programa que devolva o maior de 7 números fornecidos, usando as funções maior
de 2 e maior de 3.
3)

a. Fazer uma função que calcule a potência de xn, usando apenas multiplicação, para expoente
natural, inteiro e real (sem utilizar funções ou operadores de potência prontos).
b. Fazer uma função que calcule o fatorial de um número natural fornecido. Se o número não
for natural, devolva um valor padrão de erro.
c. Fazer uma função que calcule o valor de ex através da serie:
x x0 x1 x2 x3
e = + + + + ...
0! 1! 2! 3!

A sua função deve usar as funções potência e fatorial, feitas anteriormente. Como
argumento deve ser passado o número de termos que devem ser considerados.
d. Faça um programa que utilize a função da letra c.
4)

a. Implementar a função:
f(x,y) = x2 + 3x + y2 .
xy - 5y - 3x + 15
b. Fazer um programa para tabular a função anterior para x variando de 1 a 10 e y variando de 1 a 7.
5)

a. Faca uma função toupper que receba um caracter e se for letra, devolva o seu respectivo
caso maiúsculo.
b. Faca uma função tolower que receba um caracter e se for letra, devolva o seu respectivo
caso minúsculo.
c. Faça um programa que peça uma string para o usuário e mostra-a toda em maiúsculo e
minúsculo usando as funções toupper e tolower feitas anteriormente.
6)

a. Fazer uma função divisível ( a , d ), que retorna verdadeiro se a é divisível por d, ou seja, o
resto da sua divisão inteira é 0.
b. Fazer uma função que calcule o mdc (máximo divisor comum) de dois números fornecidos,
usando a função anterior.
c. Fazer uma função que calcule o mmc de dois números fornecidos, sendo:
mmc(a,b) = (a*b)/mdc(a,b)

d. Fazer um programa que utilize a função mmc.


7)
Seja o seguinte programa. Responda:
Professor Diógenes Furlan Lógica de Programação 2 14

float x; a) Existem variáveis globais? Quais são elas?


float mult( float b ) b) Existem variáveis locais? Quais são elas?
{ c)A função mult tem parâmetros formais? Quais são eles?
float res; d)A função mult retorna algum valor? Qual seu tipo?
res = b*x; e)A função cubo tem parâmetros formais? Quais são eles?
return(res); f)A função cubo retorna algum valor? Qual seu tipo?
} g)Quais são os parâmetros reais de mult ?
float cubo() h) Quais são os parâmetros reais de cubo?
{
return(x*x*x);
}
main()
{
int y;
cin >> x >> y;
cout << mult(y);
cout << cubo();
}

8) As notas de uma turma de N alunos são lidas e armazenadas em um vetor. N também é lido.
Fazer um algoritmo contendo funções para:
a) receber o valor de N, ler as N notas, armazenando-as em um vetor (este deve ser
variável global).
b) receber o valor de N, calcular a média da turma, devolvendo seu valor à função
principal.
c) receber o valor de N, achar a maior nota, devolvendo seu valor à função principal.

9) Seja um vetor contendo N inteiros e de tamanho máximo TAM (n <= TAM). N deve ser lido do
teclado pela função principal. Considere o vetor como variável global. Fazer um algoritmo
contendo as seguintes funções:
a) leitura: recebe o valor de N e lê os N elementos do vetor.
b) menor: recebe o valor de N e devolve o menor elemento do vetor.
c) imaior: recebe o valor de N e devolve o índice do maior elemento do vetor.
d) par: recebe o valor de N e devolve o número de elementos pares do vetor
e) media: recebe o valor de N e devolve a média aritmética dos elementos do vetor.
f) acimamed: recebe o valor de N e o valor da média calculada pela função anterior e
devolve a porcentagem de elementos acima da média.
Todos os valores devolvidos devem ser impressos através da função principal.

10) Faça uma função que receba um caractere e retorne 0 se o mesmo for letra e 1 caso contrário.

11) Seja um vetor de tamanho TAM, declarado como variável global. Fazer um algoritmo contendo
as seguintes funções:
a) leitura: lê os elementos do vetor.
b) maiorsoma: devolve a maior soma entre dois elementos consecutivos do vetor.
Professor Diógenes Furlan Lógica de Programação 2 15

c) maiordif: devolve a maior diferença entre dois elementos consecutivos do vetor.

12) Seja uma string contendo um nome de pessoa e um caractere qualquer. Fazer um algoritmo
contendo as seguintes funções:
a) leitura: lê a string e o caractere devolvendo (retornando) o tamanho da string lida.
b) tamanho: retorna o tamanho (número de caracteres) string
c) n_ocor_car: recebe o caractere e o tamanho da string como argumento, devolvendo o
número de ocorrências do mesmo na string
d) p_ocor_car: recebe o caractere e o tamanho da string como argumento, devolvendo o
índice da primeira ocorrência do mesmo na string . Caso não haja ocorrência, devolve
valor -1.
e) npalavras: recebe o tamanho da string como argumento e devolve número de palavras
da string (considere que cada palavra está separada por um espaço).
f) imprime_inv: Imprime a string invertida. Todos os valores retornados devem ser
impressos. A função principal é responsável por isso.

13) Faça uma função que recebe a idade de uma pessoa em anos, meses e dias e retorna essa
idade expressa em dias.

14) Faça uma função que recebe um valor inteiro e positivo e retorna o número de divisores desse
valor.

15) Fazer uma função que recebe um caractere e devolve o número de ocorrências desse caractere
em uma frase. Considere que a frase e o caractere são lidos na função principal. Escrever o
algoritmo completo.

16) Fazer um algoritmo contendo funções para:


a) ler um vetor onde cada elemento (vagas[i]) representa o número de vagas do curso i.
b) ler um outro vetor onde cada elemento (candidatos[i]) representa o número de candidatos
inscritos para o curso i.
c) criar um terceiro vetor contendo o número de candidatos por vaga
d) receber o índice de um curso e retornar o número de candidatos por vaga desse curso
e) retornar o índice do curso de maior concorrência
obs.: Imprima todos os resultados e considere os vetores como variáveis globais

17) Seja um vetor de inteiros (global) de tamanho TAM. Faça um algoritmo com as seguintes
funções:
a) leitura: lê os elementos do vetor.
b) imaior: retorna o índice do maior elemento do vetor.
c) media: retorna a média aritmética dos elementos do vetor.
d) troca: recebe dois valores x e y e substitui x por y no vetor. Ex.: supor x = 3 e y = 9. Se o vetor
inicialmente lido fosse {2, 5, 3, 7, -5, 3, 2, 9}, depois da troca ele ficaria: {2, 5, 9, 7, -5, 9, 2, 9}
e) imprime: imprime o vetor.
Professor Diógenes Furlan Lógica de Programação 2 16

Recursividade

Recursividade é um conceito matemático onde a solução de um problema é expressa como uma


combinação de soluções de problemas idênticos, porém menores. A solução do menor problema
possível consiste na solução de um caso extremo, o mais simples, que são as premissas sobre as
quais a solução recursiva é criada.

A existência de solução para o caso mais simples é necessária para que as equações de
definição recursiva possam ser resolvidas.

Por exemplo, a função fatorial de um número N inteiro positivo possui as seguintes


equações recursivas:

1) Fatorial (0) = 1
2) Fatorial (N) = N * Fatorial (N-1)

Observe na segunda equação, que o fatorial de um número N é expresso em função do


fatorial do seu predecessor. A primeira equação trata do caso mais simples.

Quando um algoritmo é chamado de iterativo ele requer a repetição explícita de um


processo até que determinada condição seja satisfeita, então este algoritmo poderá fazer uso de
recursão.

Em termos de programação de computadores, recursividade é utilizada quando existem


rotinas que chamam a si próprias no decorrer do seu código.

Exemplos:

• Fatorial
• Série de Fibonacci
• Sucessor

A execução de um procedimento recursivo é geralmente efetuada pelo uso de sub-rotinas. Como


uma rotina recursiva chama a si própria, é necessária uma área de memória para salvar o seu
contexto antes dessa chamada recursiva (registro de ativação) a fim de que este possa ser
restaurado ao final dessa chamada. Esses registros de ativação são organizados em forma de pilha.

Na maioria dos casos não é preciso utilizar recursividade, pois de um modo geral todo
algoritmo recursivo pode ser escrito em forma não-recursivo; no entanto, em algumas situações
ela é realmente oportuna.

A principal vantagem de sua utilização é a redução do código-fonte da rotina. Entretanto, o


uso de recursividade apresenta algumas desvantagens, tais como:
Professor Diógenes Furlan Lógica de Programação 2 17

• baixo desempenho na execução devido ao tempo gasto no gerenciamento da pilha de


registros de ativação e o espaço por ela ocupado;
• dificuldade de depuração dos algoritmos, particularmente se a recursão for muito
profunda.

Os principais critérios a serem utilizados para decidir se a recursividade deve ou não ser
utilizada é a clareza do algoritmo e o desempenho esperado pelo algoritmo.

Exercícios .
1) Defina funções recursivas para gerar as seguintes séries:
1 2 3 4 5 6 7 ...
2 4 6 8 10 ...
1 2 4 8 16 32 ...
2 1 ½ ¼ 1/8 1/16 ...
1 2 4 7 11 16 22 ...
0 1 3 7 15 31 ...

2) Escreva uma definição recursiva de a+b, onde a e b são inteiros não negativos,
em termos da função sucessora succ definida como:
succ(int x)
{
return x+1;
}

3) Imagine A como um vetor de inteiros. Apresente algoritmos recursivos para


calcular:
• o elemento máximo do vetor
• o elemento mínimo do vetor
• a soma dos elementos do vetor
• o produto dos elementos do vetor
• a media dos elementos do vetor

4) Escreva uma definição recursiva de A*B, onde A e B são inteiros não


negativos, usando somas.

5) Escreva uma definição recursiva de B^E (a elevado a b), onde B é real, E é


inteiro positivo, usando multiplicações.

6) Escreva funções em C para:


a) f(n) = 1, se n == 0
f(n-1)+3, caso contrário

b) f(n) = 2, se n == 1
2*f(n-1), caso contrário

c) f(n) = 0, se n == 0
1, se n == 1
f(n-1)+f(n-2), caso contrário
No main, imprimir os 10 primeiros valores de cada uma.