全排列的递归实现
      为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得231和312。因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。
根据规律,可以列出递归伪代码:
allArrange(str,k,m)
{
if k==m print;
for i=k to m {
swap(str,k,i); //k为第k个数
allArrange(str,k+1,m);
swap(str,k,i);} //注意,因为递归有回溯的过程,所以需要把数字重新调换回来变为”初始“的排列。

}

程序代码如下:

#include<stdio.h>
#include<string.h>
void swap(char *a,char *b)
{char temp;temp = *a;*a = *b;*b = temp;
}void  Allarrange(char *str,int k,int len)
{int i;if(k==len){static int s_i=1;printf("第%d种排列为:\t%s\n",s_i++,str);}else{for(i=k;i<=len;i++){swap(str+i,str+k);Allarrange(str,k+1,len);swap(str+i,str+k);}}
}int main()
{char str[10];printf("请输入排列的字符串:"); gets(str);Allarrange(str,0,strlen(str)-1);return 0;
}

运行效果截图:

递归的过程不易理解,可以画递归树帮助理解。以"123"为例:

注意以上的方法没有考虑到重复数字,如112将会输出:

而去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。

下面给出完整代码:

#include<stdio.h>
#include<string.h>
int IsSame(char *str,int s_First,int s_End)
{int i;for(i = s_First ; i < s_End ; i++){if(str[i]==str[s_End])return 0;}return 1;
}void swap(char *a,char *b)
{char temp;temp = *a;*a = *b;*b = temp;
}void  Allarrange(char *str,int k,int len)
{int i;if(k==len){static int s_i=1;printf("第%d种排列为:\t%s\n",s_i++,str);}else{for(i=k;i<=len;i++){if(IsSame(str,k,i)){swap(str+i,str+k);Allarrange(str,k+1,len);swap(str+i,str+k);}}}
}int main()
{char str[10];printf("请输入排列的字符串:"); gets(str);Allarrange(str,0,strlen(str)-1);return 0;
}

运行效果截图:

全排列的递归算法(C语言)相关推荐

  1. 求字符串全排列的递归算法

    求字符串全排列的递归算法 void permutation(char * p_str, char * p_begin) { if(!p_str || !p_begin) { return; } if( ...

  2. 快速排序的递归算法C语言

    下面展示快速排序的递归算法 C语言 Dev-C++ 算法思路是:添加一个基准数k和一头一尾的两个伪指针i和j. 一般将第一个元素首先作为基数k,即k=a[1].每一趟的目的是,让基数左边的数都小于(大 ...

  3. 全排列算法(C语言)

    全排列算法(C语言) 思路 图形理解 树结构 代码 思路 图形理解 我看先看一下从1–4的全排列,如下: (1)就整体排列而言可以分为四组,分别是以1打头的,以2打头的,以3打头的,以4打头的. (2 ...

  4. c语言的递归算法流程图,递归算法C语言全解.ppt

    递归算法C语言全解 第四章 递归算法 [例5]集合的划分 [问题描述] 设S是一个具有n个元素的集合,S={a1,a2,--,an},现将S划分成k个满足下列条件的子集合S1,S2,--,Sk ,且满 ...

  5. java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...

  6. c语言实现全排列并存储,C语言实现全排列和回溯法总结

    一.递归实现全排列 #include"cstdio" int A[]; void print_permutation(int n,int *A,int cur){ if(cur== ...

  7. c语言如何实现递归算法,c语言递归算法如何实现

    c语言递归算法如何实现 发布时间:2020-09-22 14:22:05 来源:亿速云 阅读:186 作者:小新 这篇文章将为大家详细讲解有关c语言递归算法如何实现,小编觉得挺实用的,因此分享给大家做 ...

  8. java全排列算法 递归算法_Java递归实现全排列

    最近整理之前自己学习Java时的一些代码笔记,可能都是一些比较基础的Java知识,在这里只是给需要的人参考一下. 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列 package inte ...

  9. c语言全排列库函数,几种全排列的算法(C语言实现)

    /* * 几种排列组合的算法 */ #include int a[20]; int n; //打印数组 void showArray(int *a) { int i; for(i=1;i<=n; ...

最新文章

  1. delphi listview怎么自动宽度_数控弯字机怎么对刀呢?
  2. Golang内建库学习笔记(1)-sort和container
  3. 华为首款搭载鸿蒙os 荣耀智慧屏,全球首款搭载鸿蒙OS终端! 荣耀智慧屏将在今天拉开面纱...
  4. 数据库 ACCESS与SQL SERVER 2000分页SQL语句 分析
  5. 矩阵的秩到底描述了什么?
  6. 用jQuery设置多个css样式
  7. 好看的按钮组件_这个发光的外骨骼盔甲是什么?为什么它如此好看!
  8. Flutter VS React Native –为什么我认为Flutter最适合移动应用程序开发
  9. 【Python】读写文件的操作
  10. OpenShift 4 - 安全上下文 SecurityContext
  11. 浏览器内核选型列表,请大家继续补充
  12. Raki的统计学习方法笔记0xB(11)章:条件随机场
  13. 使用TestNG-abbot测试GUI
  14. 微信公众号的图片引用
  15. 中国最具声望16所大学,国际排名逐个数~
  16. DaSiamRPN、SiamRPN++论文阅读
  17. php技术逻辑思维图,PHP 逻辑思维题
  18. HTML图片不能上下铺满屏幕_多张图片的PPT,如何排版的更有创意?
  19. UnityShader---光照(衰减和阴影))(内置渲染管线)---10
  20. 什么是python 包_什么是python包

热门文章

  1. 微信图片去除马赛克_照片怎么去水印,去除图片水印的简朴方式,微信公众号引流的21种方法...
  2. Jquery(四)对象遍历及特效
  3. python爬iptv直播源_GitHub - linnoreading/iptv-m3u: python 爬的直播源数据
  4. *Linux下的USB总线驱动 u盘驱动分析*
  5. 无障碍出行,他让盲人“看得见”
  6. with open (files_name) as f
  7. WannaCry勒索病毒分析过程**中**
  8. 基于离散小波变换 (DWT)的图像信息隐藏算法
  9. JAVA关于Calendar类的使用
  10. java-swing-下拉列表