- Implemente a função is_palindrome(word) de forma iterativa, com uso de while.
Passo 1
O enunciado pede para implementar a função
Informações dadas:
is_palindrome(word) de forma iterativa, usando while.Informações dadas:
- Temos uma função chamada
is_palindromeque recebe um parâmetroword(uma string). - O objetivo é retornar um valor booleano que indique se
wordé um palíndromo (ou seja, se a string lê-se igual da esquerda para a direita e da direita para a esquerda). - A implementação deve ser feita de forma iterativa, obrigatoriamente com uso de
while.
Passo 2
O que é um palíndromo?
- Uma palavra é palíndroma se, ao ler de frente ou de trás, os caracteres aparecem na mesma ordem. Exemplos:
"radar","level". Não é palíndromo:"hello". - Formalmente, para uma string
wordcom comprimento, ela é palíndroma se para todo índice com vale .
Passo 3
Estratégia escolhida (método): dois ponteiros (dois índices).
- Vamos usar dois índices:
começando em (início da string) e começando em (final da string). - Enquanto
comparamos os caracteres word[i]eword[j]. Se algum par diferir, a palavra não é palíndroma e retornamosFalse. Se conseguirmos avançar até que os índices se cruzem sem achar diferença, retornamosTrue.
Esse método é simples, eficiente e combina bem com umwhile.
Passo 4
Revisão rápida do
while (como funciona em Python) para garantir que você entenda a construção:- Sintaxe básica:
while condição: bloco_de_código - O bloco é repetido enquanto
condiçãofor verdadeira. Aqui usaremoswhile i < j:para avançar os ponteiros até se encontrarem ou cruzarem. - Precisamos garantir que dentro do laço os ponteiros mudem (
i += 1ej -= 1) para que o laço não seja infinito.
Passo 5
Construção passo a passo do algoritmo (linha a linha), explicando o porquê de cada coisa:
- Inicializar
e . -
aponta para o primeiro caractere; para o último.
-
- Iniciar o laço
while i < j:.- Enquanto houver pares a comparar (ou seja, enquanto não cruzamos), continuamos.
- Dentro do laço, comparar
word[i]comword[j].- Se
word[i] != word[j], já sabemos que não é palíndromo =>return False.
- Se
- Se forem iguais, avançar os ponteiros:
i += 1ej -= 1e repetir.- Assim comparamos o próximo par.
- Se o laço terminar sem encontrar diferença, retornamos
True.- Isso significa que todos os pares simétricos coincidiram.
Observação didática: strings em Python são indexáveis (ex.:
word[0], word[1], etc.) e o operador != compara caracteres. A função len(word) dá o comprimento da string. Tudo isso é suficiente para implementar o algoritmo sem alterar a string.Passo 6
Complexidade e justificativa rápida (importante para prova):
- Seja
. O laço compara no máximo pares, então a complexidade de tempo é . - A complexidade de espaço é
porque usamos apenas duas variáveis extras ( e ).
Passo 7
Exemplos passo a passo (simulação mental) para fixar:
- Exemplo 1:
word = "radar":-
, : comparar rer→ iguais →, . -
, : comparar aea→ iguais →, . - Agora
(iguais), laço termina → retorna True.
-
- Exemplo 2:
word = "hello":-
, : comparar heo→ diferentes → retornaFalseimediatamente.
-
Dica prática para a prova: escreva o algoritmo em poucas linhas com essa ideia de dois ponteiros; é rápido de justificar e fácil de codar.
Passo 8
Implementação em Python (iterativa, usando
while). Esta implementação é direta e segue exatamente os passos anteriores:def is_palindrome(word):
"""
Retorna True se 'word' for um palíndromo, False caso contrário.
Implementação iterativa usando while e dois ponteiros.
"""
i = 0
j = len(word) - 1
while i < j:
if word[i] != word[j]:
return False
i += 1
j -= 1
return True
Passo 9
Observações finais e variações que podem aparecer na prova (lembre-se disso):
- Se a questão pedir para ignorar maiúsculas/minúsculas, normalize antes com
word = word.lower(). - Se pedir para ignorar espaços e pontuação (ex.: frases como “A man, a plan, a canal: Panama”), filtre apenas os caracteres alfanuméricos antes da verificação, por exemplo com
''.join(ch.lower() for ch in word if ch.isalnum()). - Mas se o enunciado não mencionar normalização, use a verificação direta da string (como fizemos), que é a forma mais simples pedida.
Resposta
def is_palindrome(word):
"""
Retorna True se 'word' for um palíndromo, False caso contrário.
Implementação iterativa usando while e dois ponteiros.
"""
i = 0
j = len(word) - 1
while i < j:
if word[i] != word[j]:
return False
i += 1
j -= 1
return True