递归Palindrome函数判断结果正确但行为异常,求原因解析
递归回文函数的重复输出与参数异常问题分析
问题描述
用C语言实现了递归回文判断函数,能正确判断字符串是否为回文,但存在两个问题:
- 输入字符串"ana"时,
printf输出4次,而非预期的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
相关产品推荐
相关产品推荐

