使用递归转换字符

C++: Using Recursion Transform characters

本文关键字:字符 转换 递归      更新时间:2023-10-16

我正在制作一个程序,它将使用递归转换字符串。该方法将所有出现的大写字符替换为"1",将所有出现的"o"替换为2,将所有出现的"r"替换为a。

要求:递归函数只能接受一个参数,该参数是输入字符串,并返回转换后的字符串。

下面是我的代码:
 #include<iostream>
    #include<conio.h>
    #include<string>
    #include<string.h>
    using namespace std;
    int count=0;
    string convert(string a)
    {   
        int b=a.length();
        if(b>=count)
    {   
      if (isupper(a[b-(b-count)]))
      {
          a.replace(b-(b-count),1,"1");

          convert(a);
      }
      else if (a[b-(b-count)]=='o')
      {
          a.replace(b-(b-count),1,"2");  
           convert(a);
      }
      else if(a[b-(b-count)]=='r')
      {
           a.replace(b-(b-count),1,"a");

           convert(a);
      }
    }
        else
            return a;

    }

    void main()
    {
        string a;
        a="ABCrroo";
        int l=a.length();
        cout<<convert(a);
    getch();
    }

您已经将convert()定义为返回std::string,但是在函数内部有四个地方您可以进行递归调用,并且对返回值不做任何事情。如果你想把每次递归调用的结果传递回调用堆栈,你必须做些什么。

我修改了你的代码并将四个裸convert(a);行更改为return convert(a);,它输出"212a212a212a",我认为这是想要的结果。

看起来也像是在使用字符串末尾后面的索引。条件if(b>=count)允许代码使用0..length-1有效范围之外的索引。试着把它改成if(b>count)

#include<iostream>
#include<string>
#include<string.h>
string convert1(string a, int pos);
using namespace std;
int count=0;
string convert1(string a, int pos)
{ 
    if(pos < a.length())
    {
        if(isupper(a[pos])) a.replace(pos, 1, "1");
        else if(a[pos]=='o') a.replace(pos, 1, "2");
        else if(a[pos]=='r') a.replace(pos, 1, "a");
        convert1(a, ++pos);
    }
    else return a;
}

int main()
{
    string a="oYoroCoroSor";
    cout << a << endl;
    int l=a.length();
    cout<< convert1(a, 0) << endl;
    return 0;
}