谢谢@Scotty,@paddy。仅供参考,最佳解决方案是:
void RecSubsets(string soFar, string rest) {
if (rest == "") {
cout << soFar << end;
}
else {
RecSubsets(soFar + rest[0], rest.substr(1));
RecSubsets(soFar, rest.substr(1));
}
}
void CanMakeSum(string set) {
RecSubsets("", set);
}
我正在编写一个简单的程序,通过将数据分成两组(C(n-1,k-1)和C(n-1,k))并递归调用函数来计算一组中所有可能的组合。下面是我写的:
void RecSubsets(string soFar, string rest) {
if (rest == "") cout << soFar << end;
}
else {
for (int i = 0; i < rest.length(); i++) {
string next = soFar + rest[i];
string remaining = rest.substr(i+1);
RecSubsets(next, remaining);
}
}
}
void CanMakeSum(string set) {
RecSubsets("", set);
RecSubsets("", set.substr(1));
}
int main() {
string set = "abcd";
CanMakeSum(set);
return 0;
}
因此,对于“abcd”的输入字符串,它会分成 2 组(abcd 和 abc),然后通过递归调用函数来打印出组合。在这个逻辑下,输出应该是:abcd, abc, abd, ab, acd, ac, ad, a... 但是,使用上面的程序,输出是 abcd, abd, acd, ad... 我明白了从概念上讲,我想要实现的目标,但很难将其转换为代码。有人可以指出我哪里出错了吗?谢谢