使用递归

时间:2016-11-01 03:30:24

标签: c++ string recursion

A部分:让用户输入一个字符串。然后显示这个字符串,如下所示:显示字符串中的第一个字符,然后显示最后一个字符,然后显示第二个字符,然后显示第二个字符到最后一个字符,然后显示第三个字符...所以如果字符串是“abcdef”,它将显示: afbecd(输入“abcdef”) 12345 - > 15243 123456 - > 162534

B部分:现在,取消上述字符串。 即162534 - > 123456

我得到A部分工作。

  #include <iostream>
  using namespace std;
  void mash(string s);

  int main()
  {
  string sequence;
  cout << "Enter a sequence: ";
  getline(cin, sequence);
  mash(sequence);
  }

  void mash(string s)
  {
  int a = s.length();

  if (a == 0)
  {
  return;
  }
  if (a == 1)
  {
  cout << s;
  return;
  }

  cout << s[0]; 

  if(a>1)
  { 
  cout << s[a - 1]; 
  s = s.substr(1,a-2);
  mash(s);
  }
 }

但我不知道如何接近B部分。我想我可以尝试打印出偶数位置的字符,比如162534字符串,因此我会得到123.然后我想我可以尝试打印出来从最后一个到第一个的奇数位置字符,即456.组合这两个将得到原始字符串,但我不知道如何使用递归来解决B部分。

2 个答案:

答案 0 :(得分:1)

这是一个提示。因此,unmash(string s)应首先打印第一个字符s[0],然后打印unmash(s.substr(2, length - 2)),然后打印s[1]。当然,您还需要检查length <= 2是否需要区别对待。

答案 1 :(得分:0)

这是我的回答,它完全得益于所有帮助我的SO成员。

 #include <iostream>
 using namespace std;
 void unmash(string s);

 int main()
 {
 string sequence;
 cout << "Enter a sequence: ";
 getline(cin, sequence);
 unmash(sequence);
 }

void unmash(string s)
{
 int a = s.length();

 if (a == 0)
 {
 return;
 }

 if (a == 1||a == 2)
 {
 cout << s;
 return;
 }

cout << s[0];   

 if(a>1)
 {          
    unmash(s.substr(2));
    cout << s[1];   
 }
}