我正在编写一个函数,用于检查给定数组是否为回文或未使用递归。
int pal(char p[], int i, int j) {
if (i > j) return 1;
if (p[i] != p[j]) {
return 0;
}
pal(p, i++, j--);
}
void palTest() {
char p1[] = "hello";
char p2[] = "elle";
int x;
x = pal(p1, 0, 4);
if (x == 0)
printf("p1 is not a palendrom\n");
else
printf("p1 is a palendrom\n");
x = pal(p2, 0, 3);
if (x == 0)
printf("p2 is not a palendrom\n");
else
printf("p2 is a palendrom\n");
}
void main() {
palTest();
}
我预计程序会写 p2 是回文,但它没有打印任何内容。
最佳答案
函数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 ).
关于c - 我该如何解决这个堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354281/