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

Sign in to follow this  
aalex

duvida em chamar a recurcividade

Recommended Posts

aalex

estou a tentar desenvolver uma função que faça o seguinte, pegue em uma lista [(a,b),(c,d),(e,f),...] e faça o seguinte [(c-a,d-b),(e,f),...] -> (e-c-a,f-d-:) ...

espero que tenham percebido  🤔

type Time (Int,Int)
tempoesperaVarias :: [Time]->Time
tempoesperaVarias [] = (0,0)
tempoesperaVarias (h:[]) = h
tempoesperaVarias (h1:h2:hs) = (fst h2 - fst h1, snd h2 - snd h1) && tempoesperaVarias hs

o problema é que não estou a ver como chamar ai a recursividade  :) :)

Share this post


Link to post
Share on other sites
Baderous

A chamada recursiva nunca pode ser com o operador &&, porque esse trabalha sobre Bools e não sobre Time.

Mesmo assim, e conhecendo eu esse problema, acho que estás a complicar o que é simples. Para calcular o tempo de espera entre viagens, basta calcular a diferença entre a hora de chegada de uma viagem e o tempo de partida da próxima e ir somando esses resultados.

Share this post


Link to post
Share on other sites
aalex

de facto tem razão

porque o que eu quero receber é isto [((1,10),(1,20)),((1,25),(1,30))...] e calcular (1-1,25-20)

tenho este codigo ja feito mas não esta a resultar  :wallbash:

tempoesperaTotal :: [(Time,Time)]->Time
tempoesperaTotal [()] = (0,0)
tempoesperaTotal [(h:[])] = (0,0)
tempoesperaTotal [((h:hs):ts)] = (fst (fst hs) - snd (fst h), fst (snd hs) - snd (snd hs))

Share this post


Link to post
Share on other sites
Baderous

O caso para a lista vazia tem de ser mesmo com uma lista vazia: []. Não pode ser como tens, porque o que tu tens é uma lista com um unit lá dentro, que é um tipo de dados que não é sequer um par:

data () = ()

No 2º caso estás a cometer outra vez o mesmo erro de teres uma lista de listas.

No 3º caso estás a colocar dois pontos entre o h e o hs, mas parece-me que é uma vírgula. Ou então não percebi o que fizeste. Seja como for estás outra vez a usar uma lista de listas.

Share this post


Link to post
Share on other sites
aalex

:wallbash:

:)

bem vamos la por partes que já me esta a dar cabo da cabeça isto

por exemplo se eu tiver este caso [((a1,a2),(a3,a4)),((b1,b2),(b3,b4))] como posso definer = (a3-a1,a4-a2)

Share this post


Link to post
Share on other sites
Baderous
type Hora = Double
type Etapa = (Hora,Hora)
type Viagem = [Etapa]

v1 = [(9.5,10.25),(11.3,12.75),(13.5,14.75)] :: Viagem

tempoEspera :: Viagem -> Double
tempoEspera [] = 0
tempoEspera (h:[]) = 0
tempoEspera (h1:h2:t) = (fst h2 - snd h1) + tempoEspera (h2:t)

Share this post


Link to post
Share on other sites
aalex

isso da-me um Bool e não um par de Int

eu pretendia dar (horas,min) (horas,min) ... = (horas,min)

so que nao estou a ver como numa lista [((a1,a2),(b1,b2)), ((c1,c2),(c3,c4)), ... ] vou buscar o a1, o a2, o b1....    tentei (fst (fst (a1,a2)) e não resultou

:dontgetit:

Share this post


Link to post
Share on other sites
Baderous

isso da-me um Bool e não um par de Int

Não dá um Bool, devolve um Double.

eu pretendia dar (horas,min) (horas,min) ... = (horas,min)

so que nao estou a ver como numa lista [((a1,a2),(b1,b2)), ((c1,c2),(c3,c4)), ... ] vou buscar o a1, o a2, o b1....    tentei (fst (fst (a1,a2)) e não resultou

:dontgetit:

Vê se assim dá:

tempoEspera (((a1,a2),(b1,b2)):t) = (b1-a1+x,b2-a2+y)
    where (x,y) = tempoEspera t

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.