C++ 字符串置换递归问题

C++ 字符串置换递归问题,c++,recursion,C++,Recursion,(-下面回答了这个问题--) 嘿,伙计们,我知道这个问题到目前为止已经在这个网站上以各种方式得到了回答,但我想看看我是否能在不得到直截了当答案的情况下得到我问题的提示。。。对不起,如果这是多余的 所以。。。到目前为止,我的代码是这样的(正如函数所说,这应该打印出字符串“ABCD”的每个排列,并且必须递归地完成,而不使用STL算法): 无效打印置换(字符串前缀、字符串余数) { if(余数.empty()) cout问题在于,您正在修改循环中的两个字符串,因此前缀会增长,而余数会收缩 也就是说,您

(-下面回答了这个问题--)

嘿,伙计们,我知道这个问题到目前为止已经在这个网站上以各种方式得到了回答,但我想看看我是否能在不得到直截了当答案的情况下得到我问题的提示。。。对不起,如果这是多余的

所以。。。到目前为止,我的代码是这样的(正如函数所说,这应该打印出字符串“ABCD”的每个排列,并且必须递归地完成,而不使用STL算法):

无效打印置换(字符串前缀、字符串余数)
{
if(余数.empty())

cout问题在于,您正在修改循环中的两个字符串,因此
前缀
会增长,而
余数
会收缩

也就是说,您希望“顶级”调用遍历A/BCD、B/ACD、C/ABD和D/ABC,但您正在遍历A/BCD、AB/CD、ABC/D和ABC/empty

不要修改字符串,只需将您想要的值传递给递归:

void printPermutations(string prefix, string remainder)
{
    if (remainder.empty())        
        cout<<prefix<<endl;         
    else {
        for(int i = 0; i<remainder.length(); i++)      
        {
            printPermutations(prefix + remainder[i], 
                              remainder.substr(0, i) + remainder.substr(i+1));
        }
    }
} 
无效打印置换(字符串前缀、字符串余数)
{
if(余数.empty())

CUT

请考虑使用STL算法进行作业。您的情况下的代码比:

#include <algorithm>
#include <string>
#include <iostream>
 
int main()
{
    std::string s = "ABCD";
    std::sort(s.begin(), s.end());
    do {
        std::cout << s << '\n';
    } while(std::next_permutation(s.begin(), s.end()));
}
#包括
#包括
#包括
int main()
{
std::string s=“ABCD”;
std::sort(s.begin(),s.end());
做{

std::不欢迎使用堆栈溢出。请阅读,接受SO,阅读,以及。最后,请学习如何处理您的问题,例如包含实际问题。您显示的代码有什么问题?您需要我们的帮助吗?您想要实现什么?如果我认为这是我不确定的,那么可以递归完成。置换ns不需要递归,组合可以用递归来完成。@samthegolden任何循环都可以用递归来完成,所以这可以用递归来完成,但我不确定它的必要性。你是对的@johnI感谢你的回答,但我们不允许使用任何STL算法。这是用于类中的递归项目。@s0rry你可以从STL中学习算法如何完成此任务。cppreference.com上的文档(答案中的链接)显示了一个可能的实现。我明白了。我觉得教授会不赞成我们不努力自己解决问题,但递归似乎有时会碰壁,不得不寻求提示。我感谢你的回答。我明白了。非常感谢你的回答。我不知道为什么我没有想到用o传递更新的值但是传递原始字符串。我很难“看到”递归调用在将来的调用中将要做什么。我画出了树,它是有意义的,但是我不知道如何正确地实现它。另外,为了便于将来参考,我只想澄清一下:将它视为树的一个分支先完成,然后返回到顶部,第二个分支完成,这对吗?比如说A是前缀->整个A树完成,然后返回到原始的for循环,并将B设置为前缀->B树完成,依此类推?@s0rry是的,循环是这样说的-“打印以“A”开头的排列,打印以“B”开头的排列,…(您还可以添加跟踪输出并查看。添加“深度”“将参数添加到函数中,以便您可以看到自己的位置,这可能会有所帮助-这就是我所做的,以查看您的代码的用途。)
void printPermutations(string prefix, string remainder)
{
    if (remainder.empty())        
        cout<<prefix<<endl;         
    else {
        for(int i = 0; i<remainder.length(); i++)      
        {
            string thisPrefix = prefix + remainder[i];
            string thisRemainder = remainder.substr(0, i) + remainder.substr(i+1);
            printPermutations(thisPrefix, thisRemainder);
        }
    }
}
#include <algorithm>
#include <string>
#include <iostream>
 
int main()
{
    std::string s = "ABCD";
    std::sort(s.begin(), s.end());
    do {
        std::cout << s << '\n';
    } while(std::next_permutation(s.begin(), s.end()));
}