String mash (recursion) C++

String mash (recursion) C++

本文关键字:C++ recursion mash String      更新时间:2023-10-16

我有一个作业,要求我做以下任务:"让用户输入一个字符串。然后按如下方式显示这个字符串:显示字符串中的第一个字符,然后是最后一个,然后是第二个,然后是倒数第二个,然后是第三个……所以如果字符串是" abcdef ",它将显示:(输入"abcdef")这是我的方法,但它没有运行。我有一个分割错误11.

#include <iostream>
#include <cmath>
using namespace std;
void printLetters(string s);
int main()
{
  string sequence;
  cout << "Enter a sequence: ";
  getline(cin, sequence);
  printLetters(sequence);
}
void printLetters(string s)
{
  int a = floor(s.length()/2.0);
  // stopping case
  if(s == "")
  {
    return;
  }
  // reduce problem
  printLetters(s.substr(0)); 
  //cout << s[0];
  cout << s[a];
}

例如:12345。在我的函数printLetters(string s)中,我打印出从索引0开始的字符串,然后我得到完整的字符串12345。然后,我"计算"索引s.length()/2处的内容,即中间的字符"3"。然后回到字符串,继续打印从索引0开始的子字符串,但这次,它是1245。我一直重复这些步骤,直到得到1。在课上,我的教授解释过当递归过程结束时,它会从底部回到顶部。当我到达1的时候,它会回到5 2 3 4。所以我假设我会打印出字符串"15234",但我没有。如果你有什么想法,我很乐意倾听。非常感谢!

下面是另一个用于反转字符串的代码。我的教授在课堂上解释了,这就是他在代码背后给出的逻辑。

  #include <iostream>
  using namespace std;
  void printString(string s);
  int main()
  {
    printString("hello");  
    return 0;
  }
  void printString(string s)
  {
      if(s == "")
      {
        return;
      }   
      printString(s.substr(1));
      cout << s[0];
  }

试试这个

#include <iostream>
#include <string>
using namespace std;
void printLetters(string s);
int main()
{
string sequence;
cout << "Enter a sequence: ";
getline(cin, sequence);
printLetters(sequence);
cout << endl;
system("pause");
}
void printLetters(string s)
{
int a =s.length();
if (a == 0)
{
    return;
}
cout << s[0];
if(a>1)
cout<< s[a - 1];
s.erase(0, 1);
a = s.length();
if(a>1)
s.erase(a-1);
printLetters(s);
}

非常感谢。效果很好。你认为我们需要系统("暂停")吗?因为我没有将它包含在代码中,但它仍然运行。我完全理解你代码背后的逻辑。非常感谢。