FSaraiva Posted October 27, 2009 at 03:50 PM Report Share #293576 Posted October 27, 2009 at 03:50 PM 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 == Link to comment Share on other sites More sharing options...
Baderous Posted October 27, 2009 at 07:38 PM Report Share #293610 Posted October 27, 2009 at 07:38 PM 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 More sharing options...
Betovsky Posted October 27, 2009 at 07:51 PM Report Share #293613 Posted October 27, 2009 at 07:51 PM 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 More sharing options...
FSaraiva Posted October 27, 2009 at 10:52 PM Author Report Share #293633 Posted October 27, 2009 at 10:52 PM Obrigado pelas respostas...nao tenho o wimHugs no pc, testo amanha nos pcs da faculdade e dou um retorno... Muito obrigado mesmo... Link to comment Share on other sites More sharing options...
FSaraiva Posted October 28, 2009 at 10:58 PM Author Report Share #293792 Posted October 28, 2009 at 10:58 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now