排列问题(递归算法)

排列问题(递归算法)问题描述 对 n 个元素进行全排列 列出所有情况 例如 1 2 3 三个数字会得到 123 132 213 231 312 321 这 6 中情况思路 设 n 为元素个数 元素集合为 R r1 r2 r3 rn 计算方法为 Perm n 当 n 1 时 则只有一种情况 nbsp r 当 n gt 1 时 则有 r1 Perm R1 r2 Perm R2 r3 Perm R3

问题描述:对n个元素进行全排列,列出所有情况,例如1,2,3三个数字会得到1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1这6中情况

思路:设n为元素个数,元素集合为R(r1,r2,r3….rn),计算方法为Perm(n)

当n = 1时,则只有一种情况  r;

当n > 1时,则有(r1)Perm(R1),(r2)Perm(R2),(r3)Perm(R3) … … (rn)Perm(Rn)

                  以1,2,3为例全排列,共有以下排列:

                 1 Perm(2,3)  即:以1为前缀的所有组合

                 2 Perm(1,3)  即:以2为前缀的所有组合

                 3 Perm(2,3)  即:以3为前缀的所有组合

注:Perm(k,m)利用递归的思想即可不断划分前缀,直到只剩下1个元素,则只有一种情况,即为找到了一种排列。

代码:

# include 
  
    void swap(int *i, int *j) { int temp = *i; *i = *j; *j = temp; } void perm(int *p, int k, int m) { if (k == m) { for (int i = 0; i <= m; i++) { printf("%d ", p[i]); } printf("\n"); } else { for (int j = k; j <= m; j++) { swap(&p[k], &p[j]); //不断变化前缀 perm(p, k + 1, m); //递归 swap(&p[k], &p[j]); //还原集合 } } } int main() { int arr[5] = { 1, 2, 3, 4, 5 }; perm(arr, 0, 4); return 0; } 
  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217283.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:56
下一篇 2026年3月18日 上午9:56


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号