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

conde

Dúvida em função recursiva

4 mensagens neste tópico

Boas,

Eu tou aqui com uma dúvida numa função definida recursivamente. Em tempos já percebi este detalhe, agora voltei a pegar em haskell e não estou a conseguir visualizar o motivo de isto ser definido assim. A função é a seguinte:

drop :: Int -> [a] -> [a]
drop 0 xs = xs
drop (n+1) [] = []
drop (n+1) (_:xs) = drop n xs

Para quem está familiarizado com o prelude sabe o que esta função faz, recebe um inteiro e uma lista, e devolve a lista sem n primeiros elementos.

A minha dúvida está no funcionamento do (n+1) nos últimos dois casos, não tou a conseguir perceber como é que esse n+1 vai garantir que o "loop recursivo" pare. Porque (n+1) e não só n? Alguém que me possa esclarecer pff?

Desde já obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É uma questão de estilos... Podias perfeitamente ter aí n em vez de n+1.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na 3ª linha, o n+1 é dispensável e pode ser substituído pelo underscore, pois retirar qualquer elemento que seja duma lista vazia dá sempre lista vazia.

Quanto ao n+1, podes usar n se quiseres, só tens é de adaptar depois no resto da definição:

drop' :: Int -> [a] -> [a]
drop' _ [] = []
drop' 0 l = l
drop' n (x:xs) = drop' (n-1) xs

Como vês, neste caso já usei o n em vez de n+1, mas na 4ª linha, tive de usar n-1 na chamada recursiva.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desse modo fica mt mais legível. Da maneira que pus não estava a conseguir ler bem a função, daí não perceber o n+1.

Obrigado  :D

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