递归程序与全排列问题
2014-03-18 11:52
197 查看
参考自http://blog.chinaunix.net/uid-20196318-id-31175.html
2. 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序.如打印语句位于递归调用语句前,它按照递归调用的顺序 被执行。
3. 每一级的函数调用都有自己的私有变量。
4. 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反。如打印语句位于递归调用语句后,它按照递
归调用的相反顺序被执行。
5. 虽然每一级递归有自己的变量,但是函数代码并不会得到复制。
6. 递归函数中必须包含可以终止递归调用的语句.
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的全排列的组合。
code
递归的基本原理及特性:
1. 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归继续执行。2. 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序.如打印语句位于递归调用语句前,它按照递归调用的顺序 被执行。
3. 每一级的函数调用都有自己的私有变量。
4. 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反。如打印语句位于递归调用语句后,它按照递
归调用的相反顺序被执行。
5. 虽然每一级递归有自己的变量,但是函数代码并不会得到复制。
6. 递归函数中必须包含可以终止递归调用的语句.
实例:使用递归输出指定序列的全排列
问题分析:全排列是将一组数按一定顺序进行排列,如果这组数有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的全排列的组合。
code
/* 递归程序的全排列问题 基本思想: 将集合中的每一个数分别取出放在排列的第一个位置,然后对 剩下的数进行全排列,输出 */ #include <stdio.h> #include <stdlib.h> #define A 3 int s[A]={1,2,3}; void swap(int s[],int i,int j) { int temp; temp=s[i]; s[i]=s[j]; s[j]=temp; return; } void permutation(int s[],int k) { int i,j; if(k==A) //已经到最后一个数 { for(j=0;j<A;j++) { printf("%d ",s[j]); } printf("\n"); return; } for(i=k;i<A;i++) { swap(s,k,i); //交换第i个数与第1个数 permutation(s,k+1); //对余下的数进行全排列 swap(s,k,i); //恢复上次排列所做的改变 } return; } int main(void) { permutation(s,0); system("pause"); return 0; }
相关文章推荐
- 一段递归 程序(全排列问题)
- Java语言描述:递归与分治策略之全排列问题
- 由erlang的递归理解数组的全排列问题
- 全排列的递归问题可以参考这篇文章
- C++ 输出全排列 简单递归 N皇后问题
- 《算法之美》の递归与分治策略の全排列问题
- 集合的全排列问题-递归实现方法
- 由经典智力推算题中“11个教徒”的问题变形后的2个问题的javascript递归程序
- 小程序:备考问题&递归实现每天备考时间的分配(含代码)
- 《算法之美》の递归与分治策略の全排列问题
- 递归函数的练习,汉诺塔问题的程序实现(递归)
- (Java控制台程序版)递归打包整个父文件夹下的文件和子文件夹成压缩文件(*.ZIP)以及打包时常见的文件乱码和文件名乱码以及丢失文件或文件损坏问题解决办法
- 全排列问题之递归求解
- 递归回溯问题的四道经典题:N皇后,组合,全排列,二叉树路径和
- 字符串全排列问题(递归解决有重复字符问题)
- 动态规划问题数字三角形的(递归程序)
- 递归研究(二) 全排列问题
- Java基于递归解决全排列问题算法示例
- 程序算法艺术与实践:递归策略之矩阵乘法问题
- 一个简单的递归求目录的程序遇到的问题