Con el titulo explique todo. Entonces programemos:
-module(palindrome).
-export([is_palindrome/1]).
is_palindrome(Word) ->
NormalizedWord = string:to_lower(Word), % Convertir a minúsculas para evitar errores por mayúsculas
NormalizedWord == lists:reverse(NormalizedWord).
Y si lo probamos:
1> c(palindrome).
{ok,palindrome}
2> palindrome:is_palindrome("radar").
true
3> palindrome:is_palindrome("hello").
false
Como vemos anda muy bien, el tema es que tenemos que dar vuelta la palabra para comparar, lo podemos hacer un poquito más eficiente. Podriamos comparar el primer caracter con el ultimo, el segundo con el anteultimo y así ...
-module(palindrome).
-export([is_palindrome/1]).
is_palindrome(Word) ->
NormalizedWord = string:to_lower(Word), % Convertir a minúsculas
check_palindrome(NormalizedWord).
check_palindrome([]) -> true; % Caso base: una palabra vacía es palíndroma
check_palindrome([_]) -> true; % Caso base: una palabra de un solo carácter es palíndroma
check_palindrome(Word) ->
case lists:nth(1, Word) == lists:nth(length(Word), Word) of
true -> check_palindrome(lists:sublist(Word, 2, length(Word)-2));
false -> false
end.
Y si lo probamos:
1> c(palindrome).
{ok,palindrome}
2> palindrome:is_palindrome("radar").
true
3> palindrome:is_palindrome("hello").
false
4> palindrome:is_palindrome("Aibohphobia").
true
Este enfoque es más eficiente en términos de memoria porque no genera una nueva cadena invertida, sino que trabaja directamente comparando los extremos y reduciendo la longitud de la palabra.