参考自http://blog.chinaunix.net/uid-20196318-id-31175.html
递归的基本原理及特性:
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;
}