在c ++中使用递归时,不使用变量反转字符串

时间:2018-05-09 02:00:58

标签: c++ recursion

如何在函数

中提到的约束之后使用递归来反转字符串
string reverse_recurse(string forward) { // recursive
// Constraints: No loops allowed; no static local or global variables.
// Your new code goes here...
return ""; 
}

2 个答案:

答案 0 :(得分:3)

对于任何递归问题,我们需要1)使我们更接近解决方案的单个步骤,2)对较小问题的递归调用,以及3)我们可以立即返回的基本情况。

我建议单步执行交换第一个和最后一个字符,同时将所有内部字符传递给递归调用。

def reverse_recurse(forward):
    return forward[last] + 
           reverse_recurse(forward[second .. one_before_last]) +
           forward[0]

因此,reverse_recurse("abcd")会返回d + reverse_recurse(bc) + a

我们的基本案例根本不涉及任何工作。如果原始字符串具有偶数个字符,则基本情况是传入的forward是空字符串。如果原始字符串具有奇数个字符,则基本情况是传入的forward具有单个字符(原始字符串中的中间字符)。

def reverse_recurse(forward):
    if forward.len() is 0 or 1:
        return forward
    return forward[last] + 
           reverse_recurse(forward[second .. one_before_last]) +
           forward[0]

如果你理解我提出的建议,你可以用C ++实现它。 (提示:std::string::substr()存在。)

编辑1

在评论中,谢尔盖提出了一个更容易的选择。单步是隔离最终字符,递归调用是在最后一个字符串上:

def reverse_recurse(forward):
    if forward.len() is 0 or 1:
        return forward
    return forward[last] + 
           reverse_recurse(forward[first .. one_before_last])

编辑2

现在,由于作业截止日期已经过去,这是我的实施。

string reverse_recurse(string forward) {
    if (forward.size() == 0)
        return forward;
    return reverse_recurse(forward.substr(1)) + forward.substr(0, 1);
}

答案 1 :(得分:0)

以下是Robᵩ回答中描述的第二种方法的快速实现。基本上,返回与其他元素相反连接的字符串的最后一个元素。

#include <iostream>
#include <string>

std::string reverse_string(std::string a_string) {
    return
      a_string.length() > 0 ?
        a_string.back()
          + reverse_string(a_string.substr(0, a_string.length() - 1)) :
        std::string();
}

int main() {
    std::string a_string = "live on time , emit no evil";

    std::cout << a_string << std::endl;
    std::cout << reverse_string(a_string) << std::endl;

    return 0;
}