【发布时间】:2014-10-27 09:20:35
【问题描述】:
permute() 函数陷入无限循环,我似乎找不到原因? 我尝试通过删除递归调用来检查函数,它似乎工作正常。我也有基本情况,所以不知道问题出在哪里。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string smallString(string s, int k){ // computes a string removing the character at index k
int i,j;
string res;
for(i=0,j=0;j<s.length();i++,j++){
if(i==k){j++;}
res.push_back(s[j]);
}
return res;
}
void permute(string s1, string s2, size_t len){
if(len==1)
{cout<<"length is equal to 1"<<(s1+s2)<<'\n'; return;} //base case
else{
for(int i =0;i<len;i++){
string temp= s2.substr(i,1);
s1.append(temp);
string fin = smallString(s2,i);
//cout<<temp<<'\t'<<s1<<'\t'<<fin<<'\t'<<fin.length()<<'\n';
permute(s1,fin,fin.length());
s1.erase((s1.length()-1));
//cout<<"printing s1 : "<<s1<<'\n';
}
}
}
int main(){
string s2="abc";
string s1="";
permute(s1,s2,s2.length());
return 0;
}
【问题讨论】:
-
这可能会令人震惊,但您正在递归调用
permute。 -
这可能会让人感到震惊,但没有一个理智的人会阅读这样的未缩进代码。
-
IMO,生成排列的逻辑相当复杂。你为什么不开始用调试器调试你自己的代码,在每次递归时显示文本,考虑更小的输入,你最终会发现问题的。
-
你考虑过
std::next_permutation吗? -
@nightfold : 用正确的缩进编辑代码