Upload
ellis
View
28
Download
3
Embed Size (px)
DESCRIPTION
Universidade Federal do Espírito Santo. Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres [email protected] CT VII - Sala 34 Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo. Co-Autoria: Clebson Oliveira. - PowerPoint PPT Presentation
Citation preview
Introdução à Programação uma Abordagem Funcional
Programação IProf.ª Claudia Boeres
CT VII - Sala 34 Departamento de Informática
Centro TecnológicoUniversidade Federal do Espírito Santo
Universidade Federal do Espírito Santo
Co-Autoria: Clebson Oliveira
RESOLVENDO PROBLEMAS – Os movimentos do cavalo no xadrez
Considere o jogo de xadrez, onde peças são movimentadas em um tabuleiro dividido em 8 linhas e oito colunas. Considere ainda os movimentos do cavalo, a partir de uma dada posição, conforme diagrama a seguir, onde cada possível movimento é designado por mi. No esquema, o cavalo localizado na posição (5, 4) pode fazer oito movimentos, onde o primeiro deles, m1, levaria o cavalo para a posição (7,5).
Os movimentos do cavalo
8
7
6 m3 m2
5 m4 m1
4 C
3 m5 m8
2 m6 m7
1
1 2 3 4 5 6 7 8
PROBLEMA 1
Escreva uma função que determina se, a partir de uma dada posição, o cavalo pode ou não realizar o primeiro movimento. Vamos chamá-la de pmov, e denominar seu parâmetro (a posição corrente) de (x, y).
Instâncias de pmov
INSTÂNCIA RESULTADO
pmov (5, 4) True
pmov (8, 1) False
pmov (1, 1) True
pmov (1, 8) False
Solução
pmov (x, y) = (x + 2 <= 8 ) && (y + 1 <= 8)
Testando a solução
8
7
6
5
4
3
2
1
1 2 3 4 5 6 7 8
Estendendo o problema
pmov (x, y) = (x + 2 <= 8 ) && (y + 1 <= 8)
smov (x, y) = (x + 1 <= 8 ) && (y + 2 <= 8)
tmov (x,y) = (x - 1 >= 1 ) && (y + 2 <= 8)
qmov (x,y) = (x - 2 >= 1 ) && (y + 1 <= 8)
qtmov (x,y) = (x - 2 >=1 ) && (y - 1 >= 1)
sxmov (x,y) = (x - 1 >= 1 ) && (y - 2 >= 1)
stmov (x,y) = (x + 1 <= 8 ) && (y - 2 >= 1)
omov (x,y) = (x + 2 <= 8 ) && (y - 1 >= 1)
Identificando abstrações
pmov (x,y) = f (x + 2 ) && f( y + 1)
smov (x,y) = f (x + 1) && f (y + 2)
tmov (x,y) = g (x - 1) && f (y + 2)
qmov (x,y) = g (x - 2) && f (y + 1)
qtmov (x,y) = g (x - 2) && g (y – 1)
sxmov (x,y) = g (x - 1) && g (y – 2)
stmov (x,y) = f (x + 1 ) && g (y – 2)
omov (x,y) = f (x + 2) && g (y – 1)
f w = w <= 8
g w = w >= 1
Análise da solução Clareza - Na medida em que agora está explicitado,
que todas as oito funções para verificar os movimentos possuem estrutura semelhante e que todas estão usando funções para verificar a ultrapassagem das bordas;
Manutenção - Se nosso tabuleiro mudasse, ou seja, passasse a ter 9 linhas por nove colunas, bastaria alterar a função f e tudo estaria modificado, ao invés de termos que alterar as oito definições.
Reuso - As duas funções que testam as bordas poderiam ser usadas para construir funções para avaliar o movimento de outras peças do jogo de xadrez.
PROBLEMA 2
Sabemos que para cada posição alguns movimentos podem ser realizados e outros não. Como ordenamos os movimentos no sentido anti-horário, gostaríamos de obter, para uma dada posição, dos movimentos que podem ser realizados, aquele que possui o menor índice.
Qual o menor índice de movimento possível?
8 m4 m1 C1
7 C3 m5
6 m5 m8 m6
5 m6 m7
4
3 m2 m3
2 m1 m4
1 C4 C2
1 2 3 4 5 6 7 8
Instâncias de qualmov
Instância resultado
qualmov 8 1 3
qualmov 8 8 5
qualmov 3 7 1
qualmov 1 1 1
Solução
Codificando a solução
qualmov (x, y) =
if pmov x y then 1 else if smov x y then 2 else if tmov x y then 3 else if qmov x y then 4 else if qtmov x y then 5 else if sxmov x y then 6 else if stmov x y then 7 else if omov x y then 8 else 0
Análise da solução
qualmov (x, y) =
if not (pert x 1 8) || not (pert y 1 8) then 0else if pmov x y then 1 else if smov x y then 2 else if tmov x y then 3 else if qmov x y then 4 else if qtmov x y then 5 else if sxmov x y then 6 else if stmov x y then 7 else 8 wherepert x a b = a <= b && x >= a && x <= b
REVISITANDO O PROBLEMA 1
Observando a solução encontrada para o problema 1, constatamos que embora a noção de movimento do cavalo seja única, quem precisar saber se um dado movimento é válido, precisará conhecer o nome das oito funções. Estamos sobrecarregando nosso usuário ao darmos oito nomes para coisas tão parecidas. Será que temos como construir uma só função para tratar o problema?
Melhorando a interface
pmov x y
smov x y
tmov x y
qmov x y
qtmov x y
sxmov x y
stmov x y
omov x y
mov (m, x, y)
Exemplo de avaliação da função mov
> mov 7 3 4True>
Codificação da Soluçãomov (m, x, y) = if not (pert m 1 8) || not (pert x 1 8) || not (pert y 1 8) then False else if m == 1 then pmov else if m == 2 then smov else if m == 3 then tmov else if m == 4 then qmov else if m == 5 then qtmov else if m == 6 then sxmov else if m == 7 then stmov else omov where pmov = ... smov = ... tmov = ... ...
Análise da solução nova solução
<1 1 2 3 4 5 6 7 8 >8
<1 1 2 3 4 5 6 7 8 >8
<1 1 2 3 4 5 6 7 8 >8
Codificação da solução
mov (m,x,y) = if not (pert m 1 8)|| not(pert x 1 8) || not(pert y 1 8) then False else if m <= 4 then if m<= 2 then if m== 1 then pmov else smov else if m==3 then tmov else qmov else if m<= 6 then if m==5 then qtmov else sxmov else if m == 7 then stmov else omov where pmov = ... smov = ... tmov = ... ...
Número de comparações
número de valores
esquema linear (número médio)
esquema binário(número máximo)
8 4 4
100 50 7
1000 500 10
1000000 500000 20