C语言递归判断回文字符串代码输出异常,求修复方案
修复C语言递归回文字符串判断函数的问题
你的is_palindrome函数存在三处关键逻辑错误,导致所有测试用例均返回1:
- 终止条件返回值颠倒:空字符串或单个字符属于回文,应返回1,但原代码返回0;
- 字符不匹配时返回值颠倒:首尾字符不相等时说明不是回文,应返回0,但原代码返回1;
- 递归范围错误:仅移动左指针未缩小右边界,导致每次递归仍会包含原字符串的末尾字符,无法正确聚焦到剩余子串。
修复后的代码
方案1:双指针辅助函数(高效且安全)
这种方法通过首尾指针逐步向中间靠拢,避免重复计算字符串长度,也不会修改原字符串:
#include <string.h> // 静态辅助函数,仅内部调用 static int palindrome_helper(char *left, char *right) { // 指针相遇或交叉,说明所有对应字符匹配 if (left >= right) return 1; // 首尾字符不匹配,直接返回非回文标识 if (*left != *right) return 0; // 递归移动指针,缩小判断范围 return palindrome_helper(left + 1, right - 1); } int is_palindrome(char *s) { // 空字符串直接判定为回文 if (*s == '\0') return 1; // 传入首尾指针启动递归判断 return palindrome_helper(s, s + strlen(s) - 1); }
方案2:基于长度的递归优化
如果偏好不使用辅助指针,也可以通过传递长度参数来明确缩小递归处理的子串范围:
#include <string.h> static int palindrome_helper(char *s, int len) { if (len <= 1) return 1; if (*s != s[len - 1]) return 0; // 递归时左移指针,同时长度减去2(去掉已验证的首尾字符) return palindrome_helper(s + 1, len - 2); } int is_palindrome(char *s) { return palindrome_helper(s, strlen(s)); }
测试验证
使用你提供的驱动代码测试,正确输出应为:
1 1 0 1
分别对应"level"、"redder"、"test"、"step on no pets"的回文判定结果。
内容的提问来源于stack exchange,提问作者Abdurrahman Kabir
相关产品推荐
相关产品推荐

