问题:求n个元素的全排列
举例:ABC 其全排列有ABC ACB BAC BCA CAB CBA

  • 法一:

采用分割的思想把第一个元素和后面的其他元素分开思考将问题简单化

public class Quan {public static void f(char[] data,int k) //k为当前需要交换元素的位置,与它后面的元素交换{if(k==data.length) {  //当k交换到最后一个元素的位置时,打印输出结果for(int i=0;i<data.length;i++)System.out.print(data[i]+" ");System.out.println();}for(int i=k;i<data.length;i++) {{ char t=data[k];data[k]=data[i];  //对k进行交换data[i]=t;}f(data,k+1);  //交换后调用递归{char t=data[k];data[k]=data[i]; //当对前一步的元素交换后,需要将字符串进行返回到最初的位置,再进行后面的交换,用回溯法data[i]=t;  //否则会出现混乱}}}public static void main(String[] args) {char[] data="ABC".toCharArray();f(data,0);
}


  • 法二:递归法

采用递归回溯法——递归模型f(a,n,i)

f(a,n,i) 输出产生的解     若i=n
f(a,n,i) 对于j=i~n-1:a[i]与a[j]交换位置;  其他情况f(a,n,i+1);将a[i]与a[j]交换位置(恢复环境)

C++代码实现:

#include<stdio.h>
void swap(int &x,int &y)   //交换x、y
{int tmp=x;x=y;y=tmp;} void dispsolution(int a[],int n){  //输出一个解printf("(");for(int i=0;i<n-1;i++)printf("%d, ",a[i]);printf("%d)",a[n-1]); }void dfs(int a[],int n,int i)   //求a[0 ... n-1]的全排列{if(i>=n)   //递归出口dispsolution(a,n);else{for(int j=i;j<n;j++){swap(a[i],a[j]);  //交换a[i]与a[j]dfs(a,n,i+1);swap(a[i],a[j]);  //交换a[i]与a[j] }} } int main(){int a[]={1,2,3};int n=sizeof(a)/sizeof(a[0]);printf("a的全排列\n");dfs(a,n,0);printf("\n");}

递归法:求n个元素的全排列相关推荐

  1. 【Java】递归法求n个元素的全排列

    public class h {//k表示当前的交换位置.public static void f(char[] data,int k){if(k==data.length){for(int i=0; ...

  2. 算法学习——求有重复元素的全排列(递归)

    算法学习--求有重复元素的全排列(递归) 思路:看到这个题目首先能想到的一点就是:①我们要求元素的所有全排列②我们要对求出的全排列去重 第一步:求全排列,这里先讨论对不含重复元素的数组元素进行全排列, ...

  3. 三目运算法求一个大值,以及指定位数的应用,以及函数的声明,以及函数的嵌套,以及函数的递归,以及用递归法求阶乘

    1.三目运算法 首先一般方法比较两个数的大小 用空格和回车都一样 当结果非x即y的时候 我们可以用三目运算法 z=x>y?x:y 如果表达式成立取前面的值,如果表达式不成立取后面的值 也可以改成 ...

  4. 信息竞赛进阶指南--递归法求中缀表达式的值,O(n^2)(模板)

    // 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) {// 寻找未被任何括号包含的最后一个加减号for (int i = r, j = 0; i >= l; ...

  5. 减治求有重复元素的全排列

    求n个元素的全排列的所有解可以用减治法:每次拎出一个数做前缀,对剩下的元素再求全排列,直至只剩一个元素.代码源自<算法分析与设计(王晓东)>,复杂度O(n!) 1 //输出k~m的所有全排 ...

  6. 用递归法求两个数的最大公约数

    用递归法求两个数的最大公约数 求两个数的最大公约数的思路是,用辗转现除法 辗转相除法求两个数的最大公约数的步骤如下: 先用小的一个数除大的一个数,得第一个余数: 再用第一个余数除小的一个数,得第二个余 ...

  7. C语言编程用递归法求

    7,用递归法求: (x2!)+(xxx3!)+(5个x相乘5!)+-+((2n-2)个x相乘(2n-2)!)当N为某值是上式为几?(到第n项,n和x的值有键盘输入.) #include<stdi ...

  8. C语言递归算法求斐波那契,递归法求斐波那契数列(C语言版)

    斐波那契数列: 又称黄金分割数列,指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 在数学上,斐波纳契数列以如下被以递归的方法定义 ...

  9. PTA——递归法求最大公约数

    个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来. 专栏:PTA习题及解析 介绍:记录了博主在pta学习练题的一些方法与笔记. 目录 前言 1.简介 2.优点 一.题目 ...

最新文章

  1. Nature: 海洋病毒对环境基因组和潜在的生物地球化学影响
  2. bootstrap select 插件两级联动
  3. 汇编语言--串处理指令
  4. JAVA中的面向对象与内存解析_2
  5. 运维从业人员是否需要考证?
  6. Vue组件通信原理剖析(二)全局状态管理Vuex
  7. 每日站立会议个人博客二
  8. 《Python Cookbook 3rd》笔记(2.14):合并拼接字符串
  9. FPGA外挂DDR存储器简介
  10. 《Android开发案例驱动教程》
  11. Oracle RAC -常见CRS命令
  12. 国军标GJB150三防试验(霉菌+盐雾+湿热)
  13. Java小项目 屏幕自定义尺寸GIF生成器V1.0
  14. 2021年4月蓝桥杯软件类省赛:题目+解析(完整版)
  15. 微讲师录课软件下载、录屏软件下载
  16. 高斯过程--在GPyTorch中实现一个个性化kernel
  17. Android 获取时间戳
  18. 双创计算机应用基础答案,“双创”背景下基于《计算机应用基础》课程网络学习空间的教学实践与研究(原稿)...
  19. Windows XP将显示桌面图标放到任务栏
  20. JavaWEB10:Request、Response

热门文章

  1. python和c语言的区别-python和c语言的区别是什么
  2. 零基础学python图文版-零基础学Minecraft编程(图文版)中文pdf_Python教程
  3. 什么是python基础教程-python基础教程之python是什么?概念解析
  4. python和java哪个好-Python和Java到底哪个更好?
  5. linux语音识别_linux语音识别 arm_linux 语音识别引擎 - 云+社区 - 腾讯云
  6. [转载]基于Stm32,LD3320的非特定语音识别USB HID Keyboar
  7. 百度长语音识别免费开放 大幅提升语音转写效率
  8. Redis必须要知道的几点
  9. 步骤条与Tab栏的联动 ~ 不要错过
  10. linux中用at命令5分钟后执行,我使用过的Linux命令之at - 在指定时间执行一次任务...