页次: 1
示例代码
#include <stdio.h> int p[] = {1, 2, 3 , 4}; void f(int *p , int i) { if(i == 4) { int j; for(j = 0; j < 4; j++) { printf("%-2d", p[j]); } printf ("\n"); } else { int k; int tmp; for(k = i; k < 4; k++) { tmp = p[k]; p[k] = p[i]; p[i] = tmp; f(p, i+1); tmp = p[k]; p[k] = p[i]; p[i] = tmp; } } } int main() { f(p, 0); return 0; }
程序分析:
程序执行的目的是 , 对于一个数组, 数组中有四个数 1, 2, 3, 4 . 打印这四个数的全排列。
函数 f 表示这个排列。
函数 f 有两个参数 和一个 p, 一个 i. 表示: 对于给定的数组 p ,前i 个元素已经排好了。
所以 如果 i == 4 表示本次排列四个元素都用了, 本次的排列结束, 打印结果。
重点是这段代码的理解
for(k = i; k < 4; k++) { tmp = p[k]; p[k] = p[i]; p[i] = tmp; // 语句1 f(p, i+1); // 语句2 tmp = p[k]; p[k] = p[i]; p[i] = tmp; // 语句3 }
再main 中执行的是 f(p, 0) 也就是说开始的时候,没有一个排好。
第一次执行的时候 k 和 i都是等于0 的。
执行语句 1 表示, 排列一个元素,语句1执行4次后才执行 语句3.
执行3之前已经打印了一次结果。
ipbbs.net
离线
页次: 1