`
scorpiomiracle
  • 浏览: 264226 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

C 递归实现 全排列

阅读更多
引用

    全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为

例说明如何编写全排列的递归算法。



1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。

由于一个数的全排列就是其本身,从而得到以上结果。

2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。

即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.

从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。

因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。

为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。

C代码
#include <stdio.h>   
 
int n = 0;   
 
void swap(int *a, int *b)  
{      
    int m;      
    m = *a;      
    *a = *b;      
    *b = m;  
}   
void perm(int list[], int k, int m)  
{      
    int i;      
    if(k > m)      
    {           
        for(i = 0; i <= m; i++)              
            printf("%d ", list[i]);          
        printf("\n");          
        n++;      
    }      
    else      
    {          
        for(i = k; i <= m; i++)          
        {              
            swap(&list[k], &list[i]);              
            perm(list, k + 1, m);              
            swap(&list[k], &list[i]);          
        }      
    }  
}  
int main()  
{      
    int list[] = {1, 2, 3, 4, 5};      
    perm(list, 0, 4);      
    printf("total:%d\n", n);      
    return 0;  
}   
分享到:
评论

相关推荐

    JAVA递归实现全排列

    JAVA递归实现全排列算法,含实现源代码,如a、b、c、d的全排列为: abcd abdc acbd acdb adcb adbc bacd badc bcad bcda bdca bdac cbad cbda cabd cadb cdab cdba dbca dbac dcba dcab dacb dabc

    递归实现全排列

    ### 递归实现全排列:理解与实践 在计算机科学领域,全排列是一个经典的问题,尤其是在算法设计和数据结构的学习中。全排列指的是一个集合的所有可能的排列方式,例如,对于一个包含三个不同数字的集合{1, 2, 3},...

    c语言递归算法实现数列全排列.pdf

    c语言递归算法实现数列全排列.pdf

    C语言实现的全排列算法

    下面是一个C语言实现全排列的伪代码: ```c void permute(char arr[], int start, int end) { if (start == end) { // 打印或记录当前排列 printArray(arr); } else { for (int i = start; i ; i++) { // ...

    非递归对输入的数字进行全排列_C语言实现

    上传之后才发现头文件少了个ctype.h,因为判断非法输入的时候用到了isalpha(),不加这个头文件的话在gcc下会有警告,在VC下可能编译不过! 首先把输入的各个数由小到大进行排序,然后开始 1.找出比右边数字小的第一...

    递归应用C语言实现

    包含多个经典的递归应用代码: 1.fibonacci.c 是斐波拉契数列递归解法 ...3.permutation.c 是全排列递归算法 4.queen.c 是八皇后递归算法 5. reverse.c 是递归的测试代码 6.strlrn.c 是求字符串长度的递归算法

    C语言实现全排列源文件

    本源程序经过测试正常运行,且修改数组时有提示修改相关地方即可正确使用,不必理解程序是如何实现(采用递归分治策略实现)的。

    C语言全排列的递归算法

    在本例中,我们将聚焦于如何使用C语言实现全排列的递归算法。 全排列递归算法的核心思想是基于递归函数,它通过不断地将当前元素与剩余未排列的元素进行交换来生成所有可能的排列。下面是一个简化的C语言实现全排列...

    C语言实现全排列算法模板的方法

    在本文中,我们将通过示例代码介绍C语言实现全排列算法模板的方法,着重强调递归思路和 Swap 函数的实现细节。读者可以通过学习本文,掌握全排列算法的实现过程,并应用于实际项目中。 1. 什么是全排列算法? ...

    objective-c数组全排列算法

    // 递归实现全排列 + (void)permuteArray:(NSArray *)array withCurrent:(NSMutableArray *)current toArray:(NSMutableArray *)results { if (current.count == array.count) { [results addObject:[current copy...

    求一个动态数组的全排列,c语言实现

    用c语言实现对一个动态数组的全排列,其中保存生成的全排列用了一个二维指针,求全排列用的递归的方法,代码在vc++6.0下调试通过,并附有详细注释。

    如何通过python实现全排列

    以下是一个递归实现全排列的示例: ```python def perm(lis): if len(lis) return [lis] result = [] for i in range(len(lis)): s = lis[:i] + lis[i + 1:] sub_permutations = perm(s) for sub_...

    C语言将数据全排列算法

    此算法在递归的基础上实现的,可以输入数据,也可以把把改写成求组合的算法

    C/C++全排列

    在C/C++编程语言中,实现全排列通常需要借助递归或回溯法。以下是对全排列及其C/C++实现的详细解释。 首先,全排列是指从给定的n个不同元素中取出所有可能的m个元素的排列方式,其中m小于等于n。如果m等于n,那么这...

    几种全排列的算法(C语言实现)

    本文将详细介绍几种C语言实现全排列的算法,并结合“排列组合ppt详解及源代码”进行深入解析。 1. **回溯法**: 回溯法是一种试探性的解决问题方法,当发现某一步选择不正确时,可以退回一步甚至多步,重新选择...

    五个数的全排列

    在这个场景中,我们关注的是使用C语言来实现对5个数的全排列。C语言是一种底层、高效的编程语言,适合处理这种计算密集型的任务。 全排列的实现通常采用回溯法或递归策略。回溯法是一种试探性的解决问题的方法,当...

    Java实现字符数组全排列的方法

    在上述代码中,`AllSort` 类包含了实现全排列的主要逻辑。`permutation` 方法是核心函数,它接受一个字符数组 `buf`、起始索引 `start` 和结束索引 `end` 作为参数。当 `start` 等于 `end` 时,表示只有一个元素需要...

    全排列VisualC++程序

    // 递归实现全排列 void permute(int index) { // 基线条件:所有元素都被选择过 if (index == elements.size() - 1) { print(elements); return; } // 对剩余元素进行全排列 for (int i = index; i (); ++i...

    全排列C语言版

    递归算法基本,输出一个数列的全排列,C语言实现

Global site tag (gtag.js) - Google Analytics