浙大版《数据结构》习题2.8 输出全排列(20 分)——递归法

题目:https://pintia.cn/problem-sets/434/problems/5811

请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列 a 1 , a 2 , , a n 排在序列 b 1 , b 2 , , b n 之前,如果存在k使得 a 1 = b 1 , a 2 = b 2 , , a k = b k 并且 a k + 1 < b k + 1
输入样例:

3

输出样例:

123
132
213
231
312
321

代码:递归法(递归调用发生在for循环内)

#include <stdio.h>
#define MAXSIZE 9
int arr[MAXSIZE];
void Arrange(int arr[], int n, int curPos);
int main()
{
    int n;
    scanf("%d", &n);
    Arrange(arr, n, 0);

    return 0;
}

void Arrange(int arr[], int n, int curPos){
    /*  递归函数:前继段已完成,设定arr[curPos],设定后续段
        递归出口:curPos=n,当前排列完成,输出
    */
    int i, curNum, j;
    if(curPos==n){ /*输出一个排列*/
        for(i=0; i<n; i++)
            printf("%d", arr[i]);
        printf("\n");
        return;
    }
    else{ /*找到[1,n]中未填入arr的最小值填入arr[curPos]*/
        for(curNum=1; curNum<=n; curNum++){
            /*  curNum=1时,可能curPos=0
                curNum=2时,也可能curPos=0,
                因为curPos+1层返回后当层curPos没变,而循环变量curNum自增了
            */
            for(j=0; j<curPos; j++)
                if(arr[j]==curNum)
                    break;
            if(j==curPos){ /*curNum未安排*/
                arr[curPos] = curNum;
                Arrange(arr, n, curPos+1); 
                /*第三个参数改为++curPos竟然出错,
                因为改变了当层递归的变量值*/
            }
        }
        return;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36913610/article/details/82080274