Exercício 20: Construir um programa que utiliza uma função recursiva verifPalid que verifica se uma string é Palídroma ou não.
Passo 1
Resumo do enunciado: precisamos criar um programa em C que leia uma string e use uma função recursiva chamada verifPalid para testar se ela é palíndroma (lê-se igual de trás para frente). Vamos usar conceitos de recursão e manipulação de índices em strings.
Passo 2
Definição da função recursiva: a ideia é comparar o caractere na posição inicial i com o da posição final j; se forem diferentes devolvemos false, se iguais avançamos i+1 e j−1. O caso base ocorre quando i ≥ j, o que quer dizer que todos os pares já casaram e podemos retornar true.
Passo 3
Protótipo e caso base da função: declaramos
bool verifPalid(const char *s, int i, int j);
No corpo, primeiro testamos se i ≥ j e retornamos true.
Passo 4
Caso recursivo: caso i < j, verificamos se s[i] != s[j]. Se forem diferentes retornamos false. Caso iguais, chamamos recursivamente verifPalid(s, i+1, j-1).
Passo 5
Programa principal: no main lemos a string (com fgets para evitar overflow), calculamos o tamanho (strlen), chamamos verifPalid(s, 0, len-1) e mostramos na tela uma mensagem dizendo se é ou não palíndroma.
Passo 6
Teste: exemplos como “radar” (deve dar palíndroma) e “teste” (não palíndroma) para validar o funcionamento.
Resposta
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
// Função recursiva que verifica se s[i..j] é palíndroma
bool verifPalid(const char *s, int i, int j) {
// Caso base: índices se cruzaram ou são iguais
if (i >= j) {
return true;
}
// Se comparar e achar diferente, não é palíndroma
if (s[i] != s[j]) {
return false;
}
// Caso recursivo: avança nas bordas
return verifPalid(s, i + 1, j - 1);
}
int main() {
char s[100];
// Lê uma linha de até 99 caracteres
printf("Digite uma string: ");
if (fgets(s, sizeof(s), stdin) == NULL) {
return 1;
}
// Remove '\n' final, se existir
size_t len = strlen(s);
if (len > 0 && s[len - 1] == '\n') {
s[len - 1] = '\0';
len--;
}
// Chama a função recursiva
if (verifPalid(s, 0, len - 1)) {
printf("\"%s\" é palíndroma.\n", s);
} else {
printf("\"%s\" não é palíndroma.\n", s);
}
return 0;
}