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

递归Palindrome函数判断结果正确但行为异常,求原因解析

递归回文函数的重复输出与参数异常问题分析

问题描述

用C语言实现了递归回文判断函数,能正确判断字符串是否为回文,但存在两个问题:

  1. 输入字符串"ana"时,printf输出4次,而非预期的2次;
  2. 打印的left、right对应字符和数值出现异常。

原始代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int palindrome(int left, int right, char string[])
{
    printf("stringleft:%c,stringright:%c,Left:%d,right:%d\n", left, right, string[left], string[right]);
    if (left == right)
    {
        return 1;
    }

    if (string[left] != string[right])
    {
        return 0;
    }

    left++;
    right--;

    palindrome(left, right, string);
}

int main(int argc, char *argv[])
{
    char s[20];
    int right = 0;
    printf("Please input the string:");
    scanf("%s", s);
    while (s[right] != '\0')
    {
        right++;
    }

    right--;
    printf("Right:%d\n", right);
    if (palindrome(0, right, s))
    {
        printf("\nEntered string is palindrome!  %d", palindrome(0, right, s));
    }
    else
    {
        printf("\nEntered string is not palindrome. %d", palindrome(0, right, s));
    }
}

预期输出(输入"ana"时)

left=0,right=2,string[left]=a,string[right]=a;
left=1,right=1,string[left]=n,string[right]=n;

问题原因解析

1. printf参数顺序完全颠倒

palindrome函数中的printf语句参数逻辑错误:

  • 用%c格式符打印的是整数left、right,而非目标字符string[left]、string[right];
  • 用%d格式符打印的是字符string[left]、string[right],而非目标整数left、right。
    这直接导致打印的字符和数值完全不符合预期。

2. 递归函数被重复调用

在main函数中:

  • if (palindrome(0, right, s))会触发一次完整的递归流程,执行2次printf;
  • 进入分支后,printf里又调用了一次palindrome(0, right, s),再次触发2次printf。
    两次完整递归叠加,最终产生4次输出。

3. 递归函数缺少返回值

递归调用palindrome(left, right, string);之后没有return语句,函数执行到此处会直接退出,返回值未定义。当前场景下能得到正确结果属于偶然,这是严重的未定义行为。

修复方案

修正printf参数顺序

将printf语句调整为:

printf("left:%d,right:%d,string[left]=%c,string[right]=%c\n", left, right, string[left], string[right]);

避免重复调用递归函数

在main函数中先保存递归结果,再复用:

int result = palindrome(0, right, s);
if (result)
{
    printf("\nEntered string is palindrome!  %d", result);
}
else
{
    printf("\nEntered string is not palindrome. %d", result);
}

补全递归返回值

将递归调用语句改为:

return palindrome(left, right, string);

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int palindrome(int left, int right, char string[])
{
    printf("left:%d,right:%d,string[left]=%c,string[right]=%c\n", left, right, string[left], string[right]);
    if (left == right)
    {
        return 1;
    }

    if (string[left] != string[right])
    {
        return 0;
    }

    left++;
    right--;

    return palindrome(left, right, string);
}

int main(int argc, char *argv[])
{
    char s[20];
    int right = 0;
    printf("Please input the string:");
    scanf("%s", s);
    while (s[right] != '\0')
    {
        right++;
    }

    right--;
    printf("Right:%d\n", right);
    int result = palindrome(0, right, s);
    if (result)
    {
        printf("\nEntered string is palindrome!  %d", result);
    }
    else
    {
        printf("\nEntered string is not palindrome. %d", result);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:00:19