0

我有一个使用递归的任务。我仍然无法理解递归,或者至少理解它是如何工作的,但我想我已经开始掌握它,即使我不太确定为什么会有任何工作。

我的作业分为两部分,但目前我只需要第一部分的帮助。这是我必须做的:

编写一个递归函数,该函数将返回 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 接受一个值。按照我的理解,我应该输入要扫描的文本,然后输入要查找的字符。谁能告诉我我做错了什么,或者我什至接近递归函数?

4

3 回答 3

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);
}
于 2013-04-08T19:24:34.410 回答
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。

于 2013-04-08T19:22:20.000 回答
0

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

int main ()
{
  cout << "location  = " << test("lets test for the letter s", 's' );
                                                               ^^^^
}
于 2013-04-08T19:24:49.880 回答