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

递归实现字符串按索引配对存入vector的逻辑错误排查

问题:递归实现字符串同索引字符配对函数的逻辑错误排查

我需要实现一个返回vector<string>类型的函数,将两个字符串中同索引的字符配对组成新字符串并存入vector。例如输入strOne="shop"、strTwo="fast"时,vector应返回{"sf", "ha", "os", "pt"}。

我已编写如下重载递归函数,但逻辑存在错误,请求排查问题所在:

vector<string> function1(string strOne, string strTwo, int i) 
{
    string result;
    vector<string> strVec;

    if (strOne.size() == 0 && strTwo.size() == 0) 
    {
        return strVec;
    } 

    if (i == 0) 
    {
        result = strOne.at(i) + strTwo.at(i);
        strVec.push_back(result);
        return strVec;
    } 
    else 
    {
        strVec = function1(strOne, strTwo, i- 1);
        result= strOne.at(i) + strTwo.at(i);
        strVec.push_back(result);
        return strVec;
    }
}


vector<string> function1(string strOne, string strTwo) {
    return function1(strOne, strTwo, strOne.size() - 1);
}

我的实现思路:编写带int参数i的重载函数进行递归,以i==0为基例,通过递归逐步将配对后的字符串存入vector;无参数的重载函数调用带参数的函数,传入strOne.size()-1作为初始i值。但运行结果不符合预期,请问逻辑错误出在哪里?


错误分析及修正

1. 字符相加逻辑错误(核心问题)

当前代码中strOne.at(i) + strTwo.at(i)是将两个char类型的ASCII数值做算术相加,而非字符串拼接。例如's'(ASCII 115)和'f'(ASCII 102)相加得到217,赋值给string时会将该数值对应的ASCII字符转为字符串,最终得到的是单个奇怪字符,而非预期的两个字符拼接结果。

修正方法:将单个字符转为字符串后再拼接,两种可行方式:

// 方式1:用string构造函数转换后拼接
result = string(1, strOne.at(i)) + string(1, strTwo.at(i));
// 方式2:逐个添加字符到空字符串
result.clear();
result += strOne.at(i);
result += strTwo.at(i);

2. 未处理字符串长度不一致的边界情况

代码默认两个输入字符串长度相同,但如果其中一个字符串更短,strOne.at(i)或strTwo.at(i)会触发越界异常。可以添加判断,只处理两个字符串都存在的索引:

if (i >= strOne.size() || i >= strTwo.size()) {
    return function1(strOne, strTwo, i - 1);
}

3. 冗余且无效的空字符串判断

代码开头的if (strOne.size() == 0 && strTwo.size() == 0)几乎不会被触发:因为无参重载函数调用时,传入的i是strOne.size()-1,如果两个字符串都为空,i会是-1,直接进入else分支递归调用i=-2,最终触发at(i)的越界异常。建议替换为i < 0作为递归基例:

if (i < 0) {
    return strVec;
}

修正后的完整代码示例:

#include <vector>
#include <string>
#include <algorithm> // 用于max函数
using namespace std;

vector<string> function1(string strOne, string strTwo, int i) 
{
    string result;
    vector<string> strVec;

    if (i < 0) 
    {
        return strVec;
    }
    // 处理长度不一致的情况,超出任一字符串长度则跳过当前索引
    if (i >= strOne.size() || i >= strTwo.size()) {
        return function1(strOne, strTwo, i - 1);
    }

    // 先递归获取前面索引的配对结果
    strVec = function1(strOne, strTwo, i - 1);
    // 正确拼接两个字符为字符串
    result += strOne.at(i);
    result += strTwo.at(i);
    strVec.push_back(result);
    
    return strVec;
}

vector<string> function1(string strOne, string strTwo) {
    // 取两个字符串中较大的长度-1,确保所有有效索引都被处理
    int maxLen = max(strOne.size(), strTwo.size());
    return function1(strOne, strTwo, maxLen - 1);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:09:55