原题出自《linux C 一站式学习》:定义一个数组,编程打印它的全排列,比如定义:
#define N 3 int a[N] = { 1, 2, 3 };
则运行结果是:1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
程序的主要思路是:
1. 把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。
2. 把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列。
3. 把第3个数换到最前面来,准备打印3xx,再对后两个数1和2做全排列。
可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注
意我没有描述Base Case怎么处理,你需要自己想。你的程序要具有通用性,如果改变了 N 和数
组 a 的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排
列)。
题目贴出来了,出题者也给出了求解的思路,那么我们照着这个思路写一个递归代码吧!
#include <stdio.h> #define N 3 /*数组定义为全局变量,方便操作*/ int a[N]; /*print函数,用来输出数组顺序值,一次print就是一种排列*/ void print() { int i; for(i = 0; i < N; i++) { printf("%d ",a[i]); } printf("\n"); } /*swap函数,交换下标为 i 和 offset 的数组元素*/ void swap(int i,int sub) { int temp; temp = a[sub]; a[sub] = a[i]; a[i] = temp; } /*递归实现全排列,这里我们先不考虑数组中有相同数字的情况*/ void pailie(int sub) { int temp,i=0; if(sub == N-1) //下标指到最后一个数组元素,便输出当前序列 { print(); return; } else { for(i = sub; i < N; ++i) //根据题目思路进行交换并递归解决其余问题 { swap(i, sub); pailie(sub + 1); //递归就是假设pailie函数已经实现了,然后用它去解决剩余的事情 swap(i, sub); //再换回来 } } } int main(void) { int i; for(i=0;i<N;i++) { a[i] = i; } pailie(0); return 0; }
让我们看看运行结果:0 1 2
0 2 1
1 0 2
1 2 0
2 1 0
2 0 1
成功!
如何定义一个数组,编程打印它的全排列
最新推荐文章于 2024-07-28 15:14:33 发布