Функция pal
int pal(char p[],int i, int j)
{
if (i > j)
return 1;
if (p[i] != p[j])
{
return 0;
}
pal(p, i++, j--);
}
имеет неопределенное поведение, поскольку она ничего не возвращает в случае, когда не i> j и не p [i]! + P [j].
Вы должны написать
int pal(char p[],int i, int j)
{
if (i > j)
return 1;
if (p[i] != p[j])
{
return 0;
}
return pal(p, ++i, --j);
}
Также обратите внимание на то, что вы должны использовать операторы предварительного увеличения и предварительного уменьшения.
return pal(p, ++i, --j);
В противном случае вы переходите к следующему вызовуфункция pal
имеет одинаковые значения i
и j
.
Также первый параметр функции должен иметь квалификатор const
.
Функция может быть определена значительнопроще с использованием только двух параметров.
Вот ваша программа с обновленным определением функции и ее вызовами.
#include <stdio.h>
#include <string.h>
int pal( const char *s, size_t n )
{
return n < 2 ? 1 : s[0] == s[n-1] && pal( s + 1, n - 2 );
}
void palTest( void )
{
char p1[] = "hello";
char p2[] = "elle";
int x;
x = pal( p1, strlen( p1 ));
if (x == 0)
printf("p1 is not a palendrom\n");
else
printf("p1 is a palendrom\n");
x = pal( p2, strlen( p2 ) );
if (x == 0)
printf("p2 is not a palendrom\n");
else
printf("p2 is a palendrom\n");
}
int main(void)
{
palTest();
return 0;
}
Вместо условного оператора в операторе возврата функции, которую вы можете использоватьлогическое выражение типа
int pal( const char *s, size_t n )
{
return ( n < 2 ) || ( s[0] == s[n-1] && pal( s + 1, n - 2 ) );
}
Имейте в виду, что в соответствии со стандартом C функция main без параметров должна быть объявлена как
int main( void ).