Jump to content

Duvida recursao


FSaraiva
 Share

Recommended Posts

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:

Link to comment
Share on other 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
Link to comment
Share on other 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

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other 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 😁

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 😁

Link to comment
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
 Share

×
×
  • Create New...

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.