用字符串进行C ++递归扫描

时间:2013-04-08 19:20:08

标签: c++ recursion

我正在进行一项使用递归的作业。我仍然在理解递归方面有点麻烦,或者至少它是如何工作的,但我认为我已经开始掌握它,即使我不确定为什么有效。

我的任务分为两部分,但目前我只需要第一部分的帮助。这就是我要做的事情:

  

编写一个递归函数,它将返回C字符串中第一个>字符出现的位置

这就是我到目前为止......

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int test(string s, char x);

int main ()
{
  test("lets test for the letter s", "s" );
}

int test(string s, char x)
{
if(s.length() == 0)
    return 0;
else if (s[0] == x)
    return 1 + test(s.substr(1, s.length()), x);
else
    return test(s.substr(1, s.length()), x);
}

所以我认为这应该有效,但我对如何让函数测试任何东西感到困惑。我很确定我在main函数调用中正确完成了字符串部分,但是我无法让char接受一个值。我理解它的方式,我应该输入我想要扫描的文本,然后输入我想要查找的字符。任何人都可以告诉我我做错了什么,甚至我甚至接近递归功能?

3 个答案:

答案 0 :(得分:2)

您应该执行以下操作:

int main ()
{
   test("lets test for the letter s", 's'); 
                                   //should pass char constant 
                                 //not string literal for second parameter
}

int test(string s, char x)
{
   if(s.length() == 0)
      return 0;
   else if (s[0] == x)
      return 1 + test(s.substr(1, s.length()-1), x); 
                                //^^^second parameter of substring is length
   else
      return test(s.substr(1, s.length()), x);
}

答案 1 :(得分:1)

字符常量用单引号括起来。要测试你的函数,请写下:

cout << test("lets test for the letter s", 's') << endl;

至于你的递归函数,你就近了。 if语句具有正确的测试,您只需稍微调整return语句。

if (s.length() == 0)
    return -1;

如果字符串为空,则找不到该字符。我建议返回-1而不是0,因为返回值为0表示(对我来说)在位置0处找到该字符。-1是未找到字符时来自这些函数的传统返回码。

else if (s[0] == x)
    return 0;

你知道为什么这是return 0吗?您在索引0处找到了字符x,这就是您应该返回的内容:0

else
    return 1 + test(s.substr(1, s.length() - 1), x);

最后一个测试是唯一需要递归的测试。这是您放置1 +的位置。而且您还需要将length()减少1。

答案 2 :(得分:0)

“s”将被视为char数组或字符串。要表示单个字符,您应该使用's'

int main ()
{
  cout << "location  = " << test("lets test for the letter s", 's' );
                                                               ^^^^
}