C语言递归判断回文字符串:单参数实现(无静态变量/辅助函数)
实现无静态变量、无辅助函数的递归回文判断
我完全理解你的需求:要实现一个签名为int isPolindrom(char str[])的递归函数,判断字符串是否为回文,不能用静态变量,也不想借助辅助函数,而且输入是常量字符串。
其实是有办法做到的,核心思路是每次递归时提取中间子串,通过临时字符串传递给下一层递归——因为我们不能修改输入的常量字符串,所以需要创建临时存储来处理去掉首尾字符后的子串。
实现代码
#include <string.h> #include <stdlib.h> int isPolindrom(char str[]) { // 获取当前字符串长度 int len = strlen(str); // 终止条件:空串或单字符都是回文 if (len <= 1) { return 1; } // 比较首尾字符,不相等直接返回0 if (str[0] != str[len - 1]) { return 0; } // 分配临时内存存储中间子串(长度为原长度-2,加1存储终止符) char* temp_substr = (char*)malloc((len - 1) * sizeof(char)); if (temp_substr == NULL) { // 内存分配失败时返回0(测试场景下一般不会遇到) return 0; } // 复制原字符串去掉首尾的部分到临时串 strncpy(temp_substr, str + 1, len - 2); temp_substr[len - 2] = '\0'; // 确保字符串以终止符结尾 // 递归处理中间子串 int result = isPolindrom(temp_substr); // 释放临时内存,避免泄漏 free(temp_substr); return result; }
工作原理
- 终止条件:当字符串长度小于等于1时,直接返回1(空串或单个字符天然是回文)。
- 首尾比较:如果当前字符串的第一个和最后一个字符不相等,直接返回0,判定不是回文。
- 临时子串处理:创建临时字符串,复制原字符串去掉首尾后的中间部分,传递给下一层递归继续判断。
- 递归与内存释放:递归处理完中间子串后,务必释放临时内存,避免内存泄漏。
注意事项
- 这个方法依赖动态内存分配(
malloc/free),对于非常长的字符串可能有性能影响,但题目中的测试用例是常量字符串,一般不会出现问题。 - 我们全程没有修改输入的常量字符串,完全符合输入要求,不会触发未定义行为。
如果允许辅助函数的话,其实可以用双指针递归(传递首尾指针)来提升效率,但既然你要求不用辅助函数,这个临时串的方法是最直接的可行方案。
内容的提问来源于stack exchange,提问作者sagi
相关产品推荐
相关产品推荐

