递归--任意字符全排列(第二次写)
2013-09-05 23:00
162 查看
以前是参考书上的来写的。现在自己再动手来写一遍,这样才能真正的把它吸收。
求N个字符的全排列问题其实很简单,比如ABCD,我们可以用递归的方法,每一层递归负责管理一个字符位置选什么。比如说第一层确定第一个位置的字符:用for循环来不断的用后面的字符与第一位的交换,就可以得到不同的情况,而对于任何一种情况,又可以递归的下去。每一层都有个循环来控制对应位以及之后支付的交换即可。可能写得比较抽象,可以参考别人写的说明,因为我这是第二次写了。是用自己的理解去写的。如果再加上去除重复的话,那么就要添加一个函数,判断要交换的字符是不是和之前交换过的字符重复,重复的话就交换下一个。
代码:
求N个字符的全排列问题其实很简单,比如ABCD,我们可以用递归的方法,每一层递归负责管理一个字符位置选什么。比如说第一层确定第一个位置的字符:用for循环来不断的用后面的字符与第一位的交换,就可以得到不同的情况,而对于任何一种情况,又可以递归的下去。每一层都有个循环来控制对应位以及之后支付的交换即可。可能写得比较抽象,可以参考别人写的说明,因为我这是第二次写了。是用自己的理解去写的。如果再加上去除重复的话,那么就要添加一个函数,判断要交换的字符是不是和之前交换过的字符重复,重复的话就交换下一个。
代码:
//字符串ACB //先确定第0位,若为A:ABC ACB // 若为B:BAC BCA //到下一层递归的时候,再确定第1位 #include <stdio.h> #include <stdlib.h> void swap(char *str,int a, int b) { char tmp = str[a]; str[a] = str[b]; str[b] = tmp; } int repeat(char *str,int cnt,int a) { //返回零表示存在相等,不用交换 //返回1表示不存在相等,交换 int i; for (i = cnt; i < a; i++) { if (str[i] == str[a]) { return 0; } } return 1; } void permutaion(char *str,int n,int cnt) { //cnt是用来确定第cnt位置的位置该与 //它后面的字符串逐个的变换位置 int i,k; if (cnt == n - 1) //函数出口 { printf("%s\n",str); return; } else { for (i = cnt; i < n; i++) //第cnt位置以及之前的位置都确定了,那么就依次把i的位置与第cnt的位置 { if (repeat(str,cnt,i)) //若跟前面的相等,则不交换 { swap(str,cnt,i); permutaion(str,n,cnt+1); swap(str,cnt,i); //把位置换回来 } } } } int main() { char *str; int n; scanf("%d",&n); str = (char *)malloc((n+1)*sizeof(char)); scanf("%s",str); printf("The full permutaion is : \n"); permutaion(str,n,0); return 0; } 2013/9/5 22:59
相关文章推荐
- N个字符全排列的非递归实现
- 算法思维(递归)训练:输出字符串字符的全排列
- 递归解决输出一个字符串的全排列问题(缺陷:没有考虑字符串中字符重复的问题)
- 递归解决全排列(有重复字符)
- 运用递归输入一串任意长度的字符并输出
- 8.n个字符的全排列(递归实现)
- 字符串全排列问题(递归解决有重复字符问题)
- 采用递归算法实现任意字符的全排列问题
- 递归求解字符数组全排列问题
- 递归实现n个不同字符的所有全排列
- 递归实现的字符全排列
- N个字符全排列的递归实现
- 任意字符的矩阵输出(Square of Any Character)
- 递归求解二叉树任意一结点的深度
- bat-任意截断替换字符
- 正则表达式匹配任意字符(包括换行符)的写法
- 递归之全排列
- php递归方式的对变量中的特殊字符进行转义
- [原创]实现任意文本框的字符插入
- 非递归,按序输出集合的全排列