Jump to content

Haskell: inteiro para inteiro em ordem reversa


crislanio_macedo
 Share

Recommended Posts

Pessoal queria saber como entrar com um numero e a saida ser um numero com os seus digitos invertidos:

Entrada : Um inteiro positivo x

Saida : Um inteiro positivo equivalente a x, mas

com os dígitos na ordem inversa

exemplo:

reverso' :: Int -> Int

E X :

--rev 3491 ==> 1943

{-segue a forma como estava a fazer, mas creio que essa apesar de dá uma resposta correta, o prototipo da função não está como desejado, tenho que ou na função listaPraInteiro recebo uma lista e devolvo um elemento, ou na função rev' recebo um inteiro e devolvo uma lista, como poderia fazer de tal forma que receba um inteiro e devolva um inteiro em ordem reversa ?
-}
dMod x = (x `mod` 10)
dDiv x =(x `div` 10)

rev' :: Int -> [int]
rev' x | x<10 =  [x] -- error "Entrada invalida"
       |otherwise= if  (dDiv x) >10 then (dMod x):rev' (dDiv(x)) else dMod(x):[dDiv (x) ]

listaPraInteiro:: [int]->Int -> Int
listaPraInteiro [] a= 0
listaPraInteiro (x:xs) a= 10 * listaPraInteiro (xs) (a-1) + x
Link to comment
Share on other sites

dMod x = (x `mod` 10)
dDiv x =(x `div` 10)
{-
nessa função recebe-se um numero e retorna uma lista em ordfem reversa.
-}

rev' :: Int -> [int]
rev' x | x<10 =  [x] -- error "Entrada invalida"
      |otherwise= if  (dDiv x) >10 then (dMod x):rev' (dDiv(x)) else dMod(x):[dDiv (x) ]
{-
nessa função recebe-se uma lista e um numero e retorna um numero em ordfem reversa.
-}
listaPraInteiro:: [int]->Int -> Int
listaPraInteiro [] a= 0
listaPraInteiro (x:xs) a= 10 * listaPraInteiro (xs) (a-1) + x

{-

como foi visto o que queria realmente era receber um numero e retorna-lo em ordem reversa.Para isso não sei como proceder,

espero que me ajudem, na medida do possível pois estou a precisar , sou iniciante nesse paradigma tão importante e queria desenvolver essa questão da maneira certa.

-}

Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

Bom pessoal eu não ei como proceder como o moderador está a dizer, bom o argumento 'a' na função listPraInteriro acredito que como especificado não está a servir muito.

dMod x = (x `mod` 10)
dDiv x =(x `div` 10)

rev' :: Int -> [int]
rev' x | x<10 =  [x] -- error "Entrada invalida"
   |otherwise= if  (dDiv x) >10 then (dMod x):rev' (dDiv(x)) else dMod(x):[dDiv (x) ]

listaPraInteiro:: [int]->Int
listaPraInteiro [] = 0
listaPraInteiro (x:xs) = 10 * listaPraInteiro (xs) + x  

--isso ainda retorna uma lista ! quero pegar um numero e retornar um numero em orderm inversa
reverse' x =reverse [listaPraInteiro x]
Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

O que faz rev'? Cria uma lista com os números por ordem inversa. O que faz listaPraInteiro? Tranforma uma lista num número.

O que precisas de fazer? Uma função que combine as funções:

Relembro como se faz a composição de funções:

h = f . g

Portanto, h será a função "f após g". E tu precisas do quê? "listaPraInteiro após rev'". Certo?

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Bom pessoal eu não sabia dessa notação de composição de função, fiz dessa forma e deu certo. Mas como ficaria a composição de função dessa função ?

rev :: Int -> Int
rev x = listaPraInteiro (reverse (rev' x))

--com composição de função.
rev' :: Int -> Int
rev' =listaPraInteiro.reverse.inteiroPraLista

--deu certo valeu a todos.!
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.