【发布时间】:2014-04-05 09:21:20
【问题描述】:
我只是无法理解递归。我了解所有概念(将解决方案分解为较小的案例),并且在我一遍又一遍地阅读它们之后我可以理解解决方案。但我永远无法弄清楚如何使用递归来解决问题。有没有系统的方法来提出递归解决方案?
当他们尝试解决以下递归问题时,有人可以向我解释他们的思考过程:“使用递归返回字符串的所有排列”。
这是我解决这个问题的思考过程的一个例子。
- 检查字符串长度是否等于 2。如果是,则交换值(基本情况)
- 否则:对于每个第一个值,返回第一个值 + 递归(没有第一个值的字符串)
有人可以给我一些提示来改变我的思维过程或以更好的方式考虑递归,这样我就可以解决递归问题而无需查找答案。
编辑:这是我在编写此问题的另一种解决方案时的思考过程。
- 基本情况是字符串长度 = 0
- 如果不是基本情况,则对于字符串的每个第一个字母,将第一个字母插入字符串的每个排列的每个位置,而不是第一个字母
- 例如:字符串是“abc”,第一个字母是a,所以在“bc”排列的每个位置插入a。 [bc, cb] => [abc, bac, bca, acb, cab, cba]
伪代码
permutation(String s, List l) {
if(s.length() == 0) {
return list;
}
else {
String a = s.firstLetter();
l = permutation(s.substring(1, s.length) , l)
for(int i = 0; i < s.length(); i++) {
// loop that iterates through list of permutations
// that have been "solved"
for(int j=0; j < l.size(); j++) {
// loop that iterates through all positions of every
// permutation and inserts the first letter
String permutation Stringbuilder(l[i]).insert(a, j);
// insert the first letter at every position in the
// single permutation l[i]
l.add(permutation);
}
}
}
}
【问题讨论】:
-
你快到了。但是想想看。如果您置换“abc”,您的算法将只返回“abc”和“acb”。问题是您仅将“a”放在其他排列的开头。您需要将其放置在每个可能的位置(在这种情况下有 3 个可能的位置)
标签: algorithm recursion data-structures permutation tail-recursion