编写一个递归函数以反转输入字符串
|
我一直在阅读《面向所有人的C ++》一书,其中一项练习是写一个函数
string reverse(string str)
,其中返回值是value1ѭ的反面。
有人可以写一些基本代码并向我解释吗?从昨天开始,我一直在盯着这个问题,无法解决。我得到的最远的结果是让函数返回str
的第一个字母(我仍然不知道它是怎么发生的)
这是我所知道的(发布此问题后一个小时):
string reverse(string str)
{
string word = \"\";
if (str.length() <= 1)
{
return str;
}
else
{
string str_copy = str;
int n = str_copy.length() - 1;
string last_letter = str_copy.substr(n, 1);
str_copy = str_copy.substr(0, n);
word += reverse(str_copy);
return str_copy;
}
return word;
}
如果输入\“ Wolf \”,它将返回Wol。有人在这里帮我
如果我是return word
而不是return str_copy
,那么我会得到w
如果我return last_letter
,我得到an8ѭ
没有找到相关结果
已邀请:
18 个回复
冲汉
超可林
递归函数必须具有以下属性 它必须再次自称 递归结束时必须有条件。否则你有一个功能 会导致堆栈溢出。 此递归函数的确会创建最后一个字符的字符串,然后用字符串中除最后一个字符之外的其余部分再次调用自身。真正的切换发生在返回last + reversed的最后一行。如果这是另一种方法,那么什么也不会发生。 它的效率很低,但是可以显示这个概念。
凡夕
凄挡
犀耽澄协吻
纫合峭
究补闯
您这样称呼它:
辅奈
要调用它,请使用:
视蕉梁拌客
附言我偶然发现了这个问题,试图为C中的ѭ21中的
中的
找到一种C ++方式。却没有走22英镑的整个路线,看上去太难看了。原来,这里有ѭ23means,这意味着直到字符串结尾,并且它已经是第二个参数的默认值,因此
就足够了(此外,它看起来也更有效,并且与C中的简单
)。 但是请注意,递归通常不会随着输入的增长而扩展,除非编译器能够执行所谓的尾递归优化。 (在命令式语言中很少依赖递归。) 但是,为了激活尾部递归优化,通常要求(0),该递归仅在
语句内发生,并且(1),对递归的结果不执行进一步的操作在父函数中回调。 例如,在上述情况下,
是在子调用完成后由父级逻辑上完成的(即使您走的是更难看的
路线也可能如此),因此,它也可能会阻止大多数编译器执行尾递归优化,从而使该函数在大输入时效率非常低(如果不是由于堆耗尽而彻底中断)。 (为此,我尝试编写一种更加尾部递归友好的解决方案(确保通过函数本身的参数来增加返回结果),但是反汇编生成的二进制文件似乎表明它比像C ++这样的命令性语言所涉及的更多,请参阅gcc:如果我在C ++中返回std :: string,是否没有尾递归?)。
届甸衬丝蚕
先对冈蒲
并将函数调用为
然后递归地递增/递减变量指针。 首先,指针指向
和
并交换它们,然后它们指向
和
并交换它们。最终“ 36”要求基本情况成立,因此递归终止。这个问题的主要收获是传递输入字符串作为参考。
死狸蔽垂藐
与另一侧的字符
交换。 最后,再次调用反向函数以获取下一个索引。
谷起
淘圃跺枯替
捅瓶啡
妊辽剁茧
芳菱挨啡
芭隘的盘石