返回string类型的递归字符串反转函数异常:输入hello仅返回l
字符串反转递归函数的问题分析与修复
你的递归函数输入hello仅返回l,核心问题是每次递归只返回中间子串的反转结果,完全丢弃了之前交换的首尾字符,导致最终只保留了最内层递归的单个字符。
原代码执行流程拆解
以输入hello为例:
- 初始字符串
hello长度为5,交换首字符h和尾字符o,得到oellh; - 调用
reverse(s.substr(1, 3)),传入子串ell; - 子串
ell长度为3,交换首字符e和尾字符l,得到lle; - 调用
reverse(s.substr(1, 1)),传入子串l; - 子串
l长度为1,直接返回l; - 整个递归链仅返回最内层的
l,之前交换的o、h以及中间处理的字符都未被包含到最终结果中。
修复方案
方案1:简洁的递归拼接(无需swap)
直接通过字符串拼接实现反转逻辑,递归处理去掉首字符的子串,再将首字符追加到结果末尾:
string reverse(string s) { if (s.size() <= 1) return s; return reverse(s.substr(1)) + s[0]; }
执行逻辑:reverse("hello") = reverse("ello") + "h" → reverse("ello") = reverse("llo") + "e" → 最终拼接为o + l + l + e + h = olleh,符合预期。
方案2:保留swap逻辑,补充首尾字符拼接
如果想保留你原有的swap思路,需要将交换后的首尾字符加到中间子串反转结果的两端:
string reverse(string s) { int len = s.length(); if (len <= 1) { return s; } swap(s[0], s[len-1]); return s[0] + reverse(s.substr(1, len-2)) + s[len-1]; }
执行逻辑:交换hello首尾得到oellh后,返回o + reverse("ell") + h,而reverse("ell")会返回lle,最终拼接为o + lle + h = olleh。
内容的提问来源于stack exchange,提问作者hafsa
相关产品推荐
相关产品推荐

