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

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时,直接返回1(空串或单个字符天然是回文)。
  2. 首尾比较:如果当前字符串的第一个和最后一个字符不相等,直接返回0,判定不是回文。
  3. 临时子串处理:创建临时字符串,复制原字符串去掉首尾后的中间部分,传递给下一层递归继续判断。
  4. 递归与内存释放:递归处理完中间子串后,务必释放临时内存,避免内存泄漏。

注意事项

  • 这个方法依赖动态内存分配(malloc/free),对于非常长的字符串可能有性能影响,但题目中的测试用例是常量字符串,一般不会出现问题。
  • 我们全程没有修改输入的常量字符串,完全符合输入要求,不会触发未定义行为。

如果允许辅助函数的话,其实可以用双指针递归(传递首尾指针)来提升效率,但既然你要求不用辅助函数,这个临时串的方法是最直接的可行方案。

内容的提问来源于stack exchange,提问作者sagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:34:15