我正在进行一项使用递归的作业。我仍然在理解递归方面有点麻烦,或者至少它是如何工作的,但我认为我已经开始掌握它,即使我不确定为什么有效。
我的任务分为两部分,但目前我只需要第一部分的帮助。这就是我要做的事情:
编写一个递归函数,它将返回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接受一个值。我理解它的方式,我应该输入我想要扫描的文本,然后输入我想要查找的字符。任何人都可以告诉我我做错了什么,甚至我甚至接近递归功能?
答案 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' );
^^^^
}