You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:07:21