全排列(递归)

题目描述
给定一个正整数n(1≤n≤9),请你按字典序输出由1到n组成的所有全排列,每行输出一个排列。
输入格式
一个整数n。
输出格式
按字典序输出所有由1到n组成的全排列,每行一个排列,数字之间用空格分隔。

输入 

3

输出 

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

​
#include <bits/stdc++.h> 
using namespace std;

int flag[15];          // 标记数组,用于记录当前数字是否已被使用
int a[15];             // 存储当前排列的结果
int n;                 // 输入的正整数n

// 函数pt:打印当前排列
void pt() {
    for (int i = 1; i <= n; i++) {  // 遍历排列中的每一个数字并输出
        cout << a[i] << " ";         // 输出第i个位置上的数字
    }
    cout << endl;                   // 每完成一个排列后换行
    return;
}

// 函数f:递归成全排列
void f(int w) {
    if (w == n + 1) {              // 如果当前位置w等于n+1,说明已经填满了一个完整的排列
        pt();                       // 调用pt函数打印这个排列
        return;                     // 结束本次递归
    }

    for (int i = 1; i <= n; i++) {  // 枚举从1到n的所有可能数字
        if (flag[i] != 0) continue; // 如果当前数字已经被使用过,则跳过此次循环
        flag[i] = 1;                // 标记当前数字为已使用
        a[w] = i;                  // 将当前数字放入排列的第w个位置
        f(w + 1);                 // 递归进入下一层次,尝试填充下一个位置
        flag[i] = 0;              // 回溯:恢复当前数字的状态为未使用
        a[w] = 0;                 // 清除当前排列位置的内容以便重新尝试其他可能性
    }
}

int main() {
    cin >> n;                    // 从用户输入获取正整数n
    f(1);                        // 调用f函数开始生成全排列,初始位置设为1
    return 0;                   // 程序正常结束
}

​

全排列递归算法的C语言实现可以通过递归和交换元素来实现。在这个算法中,我们使用了一个perm函数来进行全排列操作。 引用中的代码实现了一个全排列的C语言算法。这个算法使用了递归和交换元素的技巧来生成全排列。首先,我们从数组的第一个元素开始,通过for循环选择一个元素与第一个元素交换位置,然后递归求解第二个元素到最后一个元素的全排列。然后,我们再次交换回来,以便进行下一次循环。当递归到最后一个元素时,我们已经得到了一个完整的排列,可以将其输出。这样,通过递归的方式,我们可以得到数组的所有全排列。 另外,引用中的代码实现了另一种全排列的C语言算法。这个算法使用了递归和布尔类型的数组来表示每个元素是否被使用过。通过循环遍历每个元素,并将其标记为已使用,然后递归求解剩余元素的全排列。在递归结束后,我们需要将元素的状态恢复为未使用,以便进行下一次循环。这样,通过递归的方式,我们也可以得到数组的所有全排列。 总之,无论是哪种方法,全排列算法的核心思想都是通过递归和交换元素来生成所有可能的排列。你可以选择其中一种方法来使用,具体取决于你的需求和编程习惯。123 #### 引用[.reference_title] - *1* [全排列--【C语言】递归](https://blog.csdn.net/unseven/article/details/105219139)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [排列组合之——全排列(c语言)](https://blog.csdn.net/m0_74820906/article/details/127779230)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [C语言通过递归实现全排列](https://blog.csdn.net/weixin_43394832/article/details/105313758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值