`

递归实现 全排列

阅读更多
http://www.cnblogs.com/nokiaguy/archive/2008/05/11/1191914.html

引用

    全排列是将一组数按一定顺序进行排列,如果这组数有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个数的全排列。

#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},...

    递归实现元素全排列.html

    递归实现元素全排列

    递归全排列算法

    这是一个递归完成全排列的算法,使用的是C++进行编程,希望能帮到你~

    JAVA用递归实现全排列算法的示例代码

    "JAVA用递归实现全排列算法的示例代码" JAVA用递归实现全排列算法的示例代码主要介绍了JAVA用递归实现全排列算法的相关资料。全排列算法是一种经典的算法,在数学和计算机科学领域中有着广泛的应用。该算法的主要...

    java递归实现N个数全排列输出

    在这个场景中,我们将探讨如何使用Java语言,通过回溯法来递归实现全排列的输出。 首先,我们需要理解回溯法的基本概念。回溯法是一种试探性的解决问题的方法,它尝试逐步构建解决方案,并在每一步中检查当前的解...

    全排列(阶乘)输出程序

    在C++中,实现全排列通常会借助递归的思想。递归是一种函数或过程调用自身的技术,它可以用来解决复杂的问题,尤其适用于处理具有分治特性的任务,如全排列。全排列的递归算法通常基于以下两个步骤: 1. **基本情况...

    java 递归,全排列

    java 递归,abcd全排列,非常简单的。

    递归实现元素全排列2.html

    递归实现元素全排列

    去重全排列的递归实现

    去重全排列的递归实现 去掉重复数字的 全排列的 递归实现

    objective-c数组全排列算法

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

    c++实现全排列

    C++实现全排列是算法中的一种常见问题,解决该问题可以使用递归和非递归两种方法。递归方法可以通过不断地选择每个元素来生成全排列,但是这种方法在元素个数很多时很容易造成堆栈溢出,因此需要找到一种非递归的...

    递归算法实现随机串和全排列的生成

    // 递归实现全排列 static void GeneratePermutations(int[] arr, int index) { if (index == arr.Length - 1) { Console.WriteLine(string.Join(" ", arr)); } else { for (int i = index; i ; i++) { Swap...

    python递归全排列实现方法

    本篇将重点介绍如何使用Python通过递归的方式来实现全排列。 首先,我们要理解递归的概念。递归是一种编程方法,它通过调用自身来解决问题或执行任务。在全排列问题中,我们可以将全排列视为一个由较小规模的子问题...

    不得不说的全排列算法递归实现

    此外,还需要注意编程语言的特性,比如一些语言提供的库函数可以直接用于生成全排列,但理解和掌握递归实现全排列算法对学习算法思想具有重要意义。 递归算法虽然概念上简单易懂,但是在理解和使用上往往需要一定的...

    全排列的非递归实现JAVA

    全排列的非递归实现。 输入1,2,3,4 得到 [1 2 3 4]..........[4 3 2 1]所有24种排列

    如何通过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语言实现

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

    全排列VisualC++程序

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

    python非递归全排列实现方法

    本文介绍了一种非递归方式实现全排列的方法,通过具体的代码示例详细阐述了其实现细节。相较于递归实现,该方法避免了递归带来的栈空间限制问题,更加适用于大规模数据处理。此外,通过对字符串和列表的操作,使得...

Global site tag (gtag.js) - Google Analytics