我正在学习回溯和递归,并且我陷入了一种打印字符串的所有排列的算法。我使用了贝尔算法进行置换来解决它,但是我无法理解递归方法。我在网上搜索并找到以下代码:
void permute(char *a, int i, int n) { int j; if (i == n) printf("%s\n", a); else { for (j = i; j <= n; j++) { swap((a+i), (a+j)); permute(a, i+1, n); swap((a+i), (a+j)); } } }
我无法理解该算法的基本工作原理?我什至尝试空运行!
回溯如何应用?
它比Bell算法更有效地计算置换吗?
该算法基本上适用于以下逻辑:
字符串X的所有排列与X中每个可能字符的所有排列都是相同的,再加上字符串X中没有该字母的所有排列。
也就是说,“ abcd”的所有排列都是
特别是,此算法不是对子字符串执行递归,而是在输入字符串上执行递归,而不会占用额外的内存来分配子字符串。“回溯”撤消对字符串的更改,使其保持原始状态。