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

FSaraiva

Duvida recursao

5 mensagens neste tópico

Boa tarde...

Tenho uma cadeira onde utilizamos programação em Haskell e o exercicio é:

  Defina recursivamente a função maxDigit::Int -> Int -> Int que, dado uma

base (entre 2 e 9) e um número positivo em base decimal, devolve o maior dígito da

representação desse número na base dada.

Por exemplo, como 905410 = 133709 , a avaliação maxDigit 9 9054 resulta em 7

a minha soluçao foi:

maxDigit::Int -> Int -> Int
maxDigit y x | y <= 0 = 0
     | otherwise = maximum(colocaRestosNumaLista x y [])
     

colocaRestosNumaLista::Int -> Int -> [int] -> [int]
colocaRestosNumaLista x y xs | x >= y =  (x `mod` y):xs ++ colocaRestosNumaLista (x `div` y) y xs
		     | otherwise = x:xs

A minha duvida é que a função maxDigit que deve ser recursiva não o é, pois o que é recursivo é a função auxiliar...

A minha questão e a seguinte, será que consigo fazer este exercicio utilizando recursao nos maxDigit, é que eu não consigo dado que eu preciso de uma lista para resolver o problema e na assinatura do primeiro método não o é possível...

Agradecia ajuda, é que já estou com galos de bater com a cabeça no teclado ==  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para calculares qual o maior dígito do nº calculado na base indicada, não precisas de guardar os nºs numa lista, basta ires fazendo os cálculos para o calcular na base desejada e, a cada cálculo efectuado (divisão), verificas se o novo dígito é maior do que todos os outros que já tenham sido calculados. No fim, vais obter o maior deles todos.

maxDigit :: Int -> Int -> Int
maxDigit base numDec = maxDigitAux base numDec 0
where maxDigitAux _ 0 maior = maior
      maxDigitAux base numDec maior = let (quo,resto) = divMod numDec base
				      in if resto > maior then maxDigitAux base quo resto
					 else maxDigitAux base quo maior

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas ai estás a usar uma outra função recursiva e não o maxDigit.

Consegues por o maxDigit recursivo mas fica com pior performance.

Penso que seria qualquer coisa como isto

maxDigit b n | n >= b    = max (n `mod` b) (maxDigit b (n `div` b))
            | otherwise = n

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelas respostas...nao tenho o wimHugs no pc, testo amanha nos pcs da faculdade e dou um retorno...

Muito obrigado mesmo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem já testei e vi que estavam correctissimas, mas vou optar por aplicar na  minha  a segunda soluçao nao desfazendo na primeira, mas  é que é a primeira vez que estou a trabalhar com Haskell e a 2ª é mais facil de processar :biggrin:

Agradeço aos dois que me responderam.

Nota: Espero que colegas meus nao venham ver para nao ser acusado de plágio e reprovar á cadeira, dai alunos da Fcul que venham consultar este post optem pela primeira  opçao.

Obrigado :cheesygrin:

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