网站开发技术

记点笔记、 学点技术 欢迎交流建站技术。本站关注lamp技术

您尚未登录。

#1 2014-12-19 17:34:31

admin
管理员

c语言全排列示例代码

示例代码

#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

离线

页脚

Powered by FluxBB