• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

lesiano

Dúvida em recursividade

4 mensagens neste tópico

Boas;

invertecpb :: Tabuleiro -> Tabuleiro
invertecpb [[]] = [[]]
invertecpb tab@(h:t) = if (verificartab tab) then invertecpb novotab
                        else tab
  where novotab = sndmapp((mappcorreccao tab)++([(sacaumq (sndmapp t) 1)]))

Esta função é recursiva se entrar no if. ( verificartab é uma função q retorna um bool ). No entanto, compila mas ñ apresenta nenhum resultado.

Caso retire a recursividade, ela funciona na perfeição. Isto é, devolve-me o tabuleiro original aplicado pelas funções sndmapp e mappcorreccao mais o q está à frente em novotab.

PS: Já tentei fazer a recursividade ñ com o novotab mas com "sndmapp((mappcorreccao tab)++([(sacaumq (sndmapp t) 1)]))" e tb ñ dá.

É mt importante, estou a acabar uma parte do trabalho, mas ñ consigo enquanto ñ tiver isto.

Obg.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com o código que puseste não dá para ver qual será o motivo. Mas para não estar a aparecer nenhum resultado, há 2 hipóteses.

Ou o teu código demora muito a processar e o interrompes antes de mostrar o resultado, ou então, a tua função invertecpb diverge, isto é, fica num ciclo infinito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para ter a certeza q ñ entrava num ciclo infinito, eu tinha feito:

where novotab = sndmapp((mappcorreccao tab)++([(sacaumq (sndmapp t) 1)]))++[[]]++[[]]+[[]]+[[]]+[[]]

já que isto é suficiente para ele entrar no else. Mas continua a ñ dar nada.

Tal como já disse, tb experimentei:

then invertecpb (sndmapp((mappcorreccao tab)++([(sacaumq (sndmapp t) 1)])))

e nada!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como é que adicionar listas vazias faz entrar no else?

Mostra mais informação senão nós não conseguimos ver o que está a acontecer.

Presumo que o Tabuleiro seja listas de listas.

Mas o que faz o verificartab?

E o sndmapp, mappcorreccao, sacaumq?

Pelo nome das funções não adivinhamos.

Em relação a usares no passo recursivo com ou sem o novotab é indiferente.

E o seguinte código

invertecpb :: Tabuleiro -> Tabuleiro
invertecpb [[]] = [[]]
invertecpb tab@(h:t) = if (verificartab tab) then novotab
                        else tab
  where novotab = sndmapp((mappcorreccao tab)++([(sacaumq (sndmapp t) 1)]))

Já mostra algo? Se sim então é provável que o problema esteja no verificartab e estar sempre a entrar no then...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora