TrabalhosGratuitos.com - Trabalhos, Monografias, Artigos, Exames, Resumos de livros, Dissertações
Pesquisar

Atribuições para compilar algoritmos

Ensaio: Atribuições para compilar algoritmos. Pesquise 860.000+ trabalhos acadêmicos

Por:   •  29/10/2014  •  Ensaio  •  2.479 Palavras (10 Páginas)  •  226 Visualizações

Página 1 de 10

3) Resolva a seguinte relação de recorrência (vale 1)

x(n) = x(n-1) + n p/ n>0 e x(0) = 1

= x(n-2) + (n-1) + n

= x(n-3) + (n-2) + (n-1) + n

= x(n-4) + (n-3) + (n-2) + (n-1) + n

.

.

.

= x(0) + 1 + 2 + 3 + . . . + (n-1) + n

= 1 + Somatório( i, i=1 até n) = 1 + (n/2).(n+1)

}

2) Escreva um algoritmo para identificar quantas strings disjuntas começando com A e terminando com B existem em um array unidimensional ( de 1 a n) com n caracteres.

Divisão e Conquista (vale 2)

- A idéia é ir dividindo o array em duas partes recursivamente e resolvendo o problema (recursivamente) para essas partes menores, até que o tamanho do problema (tamanho da parte do array a ser processada) chegue a 1.

- Após o retorno do processamento de duas metades o programa deve somar a quantidade de strings encontrada na parte esquerda com a quantidade encontrada na parte direita. Deve ainda acrescentar mais uma unidade a essa soma caso o retorno da parte esquerda informe que sobrou um A à direita da última string contabilizada nessa parte e o retorno da parte direita informe que tem um B antes da primeira string contabilizada nesse lado.

- Assim, o procedimento recursivo deve retornar três resultados: total de strings encontradas; se sobrou ou não pelo menos um A à direita da última (pode ser nenhuma) string contabilizada; se tem ou não pelo menos um B antes da primeira (pode ser nenhuma) string contabilizada.

StringsAB( Array, inic, fim, total, sobrouA, temB)

total = 0;

sobrouA = FALSE;

temB = FALSE;

se inic == fim {

se Array[inic] == A sobrouA = TRUE

senão se Array[inic] == B temB = TRUE;

retorne

}

meio = divisãointeira(inic, fim); /*Calcula o meio do subarray */

StringsAB( Array, inic, meio, total_esq, sobrouA_esq, temB_esq);

StringsAB( Array, meio+1, fim, total_dir, sobrouA_dir, temB_dir);

total = total_dir + total_esq;

se sobrouA_esq AND temB_dir então total++;

temB = temB_esq;

sobrouA = sobrouA_dir;

retorne

Solução Simples (vale 1) (um automato muito simples reconhece as cadeias...)

- total = 0

- Enquanto não chegar ao final do array {

- Continuar percorrendo o array da esquerda para direita até o final ou até encontrar um A;

- Se não encontrou A retorne total;

- Tendo encontrado um A, continuar percorrendo o array até o final ou até encontrar um B;

- Se não encontrou B retorne total senão total = total + 1

}

outra solução simples...

Para i = 1 até n faça

se Array[ i ] == A A_inicial = TRUE

senão se Array[ i ] == B então

se A_inicial então {

A_inicial = FALSE;

total++

}

}

1) Problema das cores da bandeira da França.

Seja um array com n elementos. Cada elemento possui uma tonalidade de uma das seguintes cores: branco, azul ou vermelho. Exemplo: VVBAABABVVVBVBVAABBBAABBBV .

Escreva um algoritmo para "transformar" o array deixando todos os As à esquerda, os Bs no meio e os Vs à direita.

Divisão e Conquista (vale 2)

- A idéia é ir dividindo o array em duas partes recursivamente e resolvendo o problema (recursivamente) para essas partes menores, até que o tamanho do problema (tamanho da parte do array a ser processada) chegue a 1.

- Após o retorno do processamento de duas metades o programa deve fazer o "merge das duas bandeiras" deixando todos os As do lado esquerdo, os Bs no meio e os Vs à direita. Se vc souber onde termina o A o B e o V de cada lado fica muito fácil fazer o tal merge com poucas trocas (como pode acontecer de não ter uma ou duas das três cores, o que devemos saber é em que posição entraria um novo elemento de uma das cores).

...

Baixar como (para membros premium)  txt (12.6 Kb)  
Continuar por mais 9 páginas »
Disponível apenas no TrabalhosGratuitos.com