全排列算法的递归思想及实现

题意:给定1~n n个正整数,写出它们的所有排列顺序。

思路:根据高中的知识,我们知道不重复的条件下结果是n!个排列顺序,在程序中我们先看看如何用递归来实现。

例如数组{1,2,3}的全排列为123,132,213,231.312.321。

可以看出一点规律来,我们依次交换了第一个数字,分别从1到3,后面是剩下数字的全排列,这里就能看出应该使用递归来实现了。

算法:首先依次交换第一个数字和每一位数字,再递归调用,最后将交换后的数组复原,以进行下一次的交换。

我自己的疑惑:在最开始看到这个题目和解法的时候,虽然能理解思路,但是看到代码还是不能完全弄懂,自己也尝试去模拟递归中的每一个步骤,但是发现其中太复杂了,最后还是看了好多人的博客对全排列的解释,才从根本思路上理解了代码的含义。

代码:

void perm(int a[],int n, int m)
{
    if(n == m)
    {
        for(int i=0;i<m;i++)
            cout<<a[i]<<" ";
        cout<<"\n";
    }

    else
    {
        for(int j = n;j<m;j++)
        {
            swap(a[n], a[j]);
            perm(a,n+1,m);
            swap(a[j],a[n]);
        }
    }
}
时间: 2024-08-07 00:18:42

全排列算法的递归思想及实现的相关文章

全排列算法的递归与非递归实现

全排列算法的递归与非递归实现 全排列算法是常见的算法,用于求一个序列的全排列,本文使用C语言分别用递归与非递归两种方法实现,可以接受元素各不相同的输入序列. 题目来自leetcode: Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3

算法之递归思想

树的遍历的实现就是典型的递归思想. /* * description:树的遍历示例,递归 * 访问顺序: * 前序: 当前节点 - 左子树 - 右子树 * 中序: 左子树 - 当前节点 - 右子树 * 后序: 左子树 - 右子树 - 当前节点 * * writeby: nick * date: 2012-10-22 23:56 */ #include <iostream> using namespace std; struct node { int item; node *l, *r; nod

全排列算法(递归)

全排列算法是一种经典的递归算法.例如集合{a,b,c}的全排列为{(a,b,c).(a,c,b).(b,a,c).(b,c,a).(c,b,a).(c,a,b)}共3!种. 递归法求解的思路是先固定第一个元素,求剩下的全排列,求剩下的全拍列时,固定剩余元素中的第一个元素,再求剩下元素的全排列,直到就剩一个元素停止. 例如求集合{a,b,c,d}的全排列. 1.固定元素a求{b,c,d}元素的全排列 (1).固定元素b求{c,d}的全排列 1).固定元素c ,得到一个排列方式(a,b,c,d) 2

python算法之递归思想

#递归思想#基本原理:函数内部调用函数本身,注意:至少有一个终止条件#例1.斐波那契数列def fib(x): if x==1 or x==2: return 1 else: return fib(x-1) + fib(x-2)def fibList(x): fibList = [] for i in range(x): fibList.append(fib(i+1)) return fibListprint(fibList(9)) #例2.n的阶乘(n*(n-1)*(n-2)*...2*1)d

【算法】递归思想

给定一个字符串(该字符串没有相同的字母),使用递归的方式打印出这个字符串所包含字母的所有组合方式 package test1; public class num { public static void main(String[] args) { char[] c= {'a','b','c','d'}; f(c,0); } /* c为待递归数组,先确定第一个字符,再确定第二个...b为所有已确定字符位的后一个字符位 */ static void f(char c[],int b) { if(b=

Python算法——递归思想

编程语言在构建程序时的基本操作有:内置数据类型操作.选择.循环.函数调用等,递归实际属于函数调用的一种特殊情况(函数调用自身),其数学基础是数学归纳法.递归在计算机程序设计中非常重要,是许多高级算法实现的基础 编写递归程序的几个要点: 1.终止条件:最简单情况(避免无限循环) 2.递归公式:相邻两次调用间的关系(递归算法核心) 3.忽略调用具体细节:假设所有调用都会达到终止条件(从思想上接受递归算法的关键) 4.效率:递归算法有时效率较低,可考虑其他更高效的实现方式(见问题5) 下面我们通过几个

全排列算法(转)

列出全排列的初始思想: 解决一个算法问题,我比较习惯于从基本的想法做起,我们先回顾一下我们自己是如何写一组数的全排列的:1,3,5,9(为了方便,下面我都用数进行全排列而不是字符). 1,3,5,9.(第一个) 首先保持第一个不变,对3,5,9进行全排列. 同样地,我们先保持3不变,对5,9进行全排列. 保持5不变,对9对进行全排列,由于9只有一个,它的排列只有一种:9.接下来5不能以5打头了,5,9相互交换,得到 1,3,9,5. 此时5,9的情况都写完了,不能以3打头了,得到 1,5,3,9

不会全排列算法(Javascript实现),我教你呀!

今天我很郁闷,在实验室凑合睡了一晚,准备白天大干一场,结果一整天就只做出了一道算法题.看来还是经验不足呀,同志仍需努力呀. 算法题目要求是这样的: Return the number of total permutations of the provided string that don't have repeated consecutive letters. Assume that all characters in the provided string are each unique.F

【codeup】1959: 全排列 及全排列算法详解

题目描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列.我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. 输入 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. 输出 输出这个字符串的所有排列方式,每行一个排列.要求字母序比较小的排列在前面.字母序如下定义:已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存