2015-11-07 54 views
1

这里是我想出了为了履行一个字符串复制每个字母的要求(即“ABC”,以“为aabbcc”)递归函数:在C++中做了递归函数。现在要求做一个“尾递归”功能

#include <string> 
#include <iostream> 

using namespace std; 

string repeater(string str){ 
    if (str == ""){ 
     return ""; 
    } 
    else{ 
     return str.substr(0,1) + str.substr(0,1) + repeater(str.substr(1)); 
    } 
} 

int main(){ 
    string test = "llama"; 
    cout << "repeater(\"" << test << "\") returned: " << repeater(test) << endl; 
} 

现在我被要求做一个“尾递归”函数来做同样的事情。我读了它,我的文字给人以“尾递归”功能的下面的例子:

int factorial(int n) { 
if (n == 0) 
return 1; 
else 
return n * factorial(n – 1); 
} 

这看起来与我用来创建我自己的方法。我需要递交递归函数的两个版本。我的已经是“尾递归”函数了吗?如果是这样,我将如何做一个前向递归函数(或者,如果情况正好相反,反之亦然)?

http://ideone.com/JrtRsE

+0

尾递归只是做递归调用的返回。在示例代码中,返回值乘以n,所以它不是尾递归。 – rcgldr

+0

我的文字错了吗?或者我读错了吗? http://postimg.org/image/jqqxd91xv/ – velkoon

+0

看看这里的例子[尾递归](http://cs.stackexchange.com/questions/6230/what-is-tail-recursion)。 – rcgldr

回答

0

我建议如下:

string tail_repeater(string left, string right){ 
    if (right == ""){ 
     return left; 
    } 
    return tail_repeater(left + right.substr(0,1) + right.substr(0,1), right.substr(1)); 
} 

string repeater(string str){ 
    tail_repeater("", str); 
} 
+0

非常感谢。我将不得不学会围绕这个来包裹我的头。我读过递归的功能几乎和循环一样。我猜想这种方式会帮助我在调试器中逐步了解发生了什么。干杯〜 – velkoon

+0

当我学会在Scheme中编程时,我学会了尾递归。如果你有时间,我会建议尝试一下。 –