我的朋友得到了一项任务,我无法帮助他。基本上,使用递归他需要以相反的顺序打印句子的单词。例如: 输入 - 这是一个句子 输出 - 句子a是这个
这是我为正常印刷而写的一个例子,我可以毫无问题地完成整个句子的反转,但我无法理解一个起点,只能递归地反转单词而不用线性方法并使用字符串库或链接列表或任何其他方式:
#include <iostream>
using namespace std;
void revSentence(char sentence[], int i)
{
if (sentence[i] == 0)
return;
cout<<sentence[i];
i++;
revSentence (sentence, i);
}
int main()
{
char sentence[100];
cin.getline (sentence, 100);
int i = 0;
revSentence(sentence, i);
return 0;
}
事情可能是非常简单的事情,因为他只用基础知识做一个快速的课程,所以除了iostream库之外他们没有使用任何东西,所以它必须是简单的东西,或者至少不是太复杂。所以我要求至少一个方法或解决方案的想法。我有一种感觉,我错过了一些非常简单的东西,但却无法看到它。
提前致谢
答案 0 :(得分:3)
这并不像你想象的那么容易。
您需要更改调用打印命令的位置,并将其置于revSentence()
递归调用之下,这称为post-order traversal
,而您正在执行的调用{{1} }}
您还需要一个堆叠来推动反转的单词。
pre-order traversal
答案 1 :(得分:1)
我不知道你是否被允许使用std :: string及其方法......但如果是这样的话......
在下面的方法中,我强调在输入句子中找到第一个和最后一个单词,然后在剩余部分使用递归(这里称为sMiddle)。
没有使用额外的stl堆栈。
输入字符串在自动变量中重复,因此它比其他一些选择使用更多的堆栈(在Linux上不是问题)。
假设 - 在第一个单词之前或最后一个单词之后没有填充。
std::string revSentence(std::string s)
{
std::string retVal;
do
{
size_t posEndW1 = s.find(' ');
if(posEndW1 == std::string::npos) break;
// from line start to end of 1st word
std::string wFirst = s.substr(0, (posEndW1));
size_t posBeginW2 = s.rfind(' '); // from end of line
if(posBeginW2 == std::string::npos) break;
std::string wLast = s.substr(posBeginW2+1, std::string::npos); // to line end
std::string sMiddle = s.substr(posEndW1+1, (posBeginW2-posEndW1-1));
retVal = wLast + " " + revSentence(sMiddle) + " " + wFirst;
}while(0);
return(retVal);
}