iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >go语言如何实现全排列
  • 721
分享到

go语言如何实现全排列

2023-07-05 09:07:18 721人浏览 薄情痞子
摘要

今天小编给大家分享一下Go语言如何实现全排列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。思路:首先画出全排列的树形结构,以

今天小编给大家分享一下Go语言如何实现全排列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

思路:

  • 首先画出全排列的树形结构,以123为例,一开始排列为空列表,第一个位置有三种可能,分别是1、2、3,画出三个分支;

  • 由于第一个位置已经被占用,那么第二个位置可选择的就只有两个,所以又可以展开两个分支,如:1下的1,2和1,3;

  • 选出两个数字之后,最后就只剩下一个数字了,所以最后一个位置上的数就是唯一确定的了。 之后这个树的所有叶子结点就是全排列的结果。

回溯过程:

  • 先选择1,之后按顺序选择2,最后没有可选数字就得到了1,2,3;为了得到所有的排列,这时候就要进行回溯。

  • 最后一步选择的是3那么回退的时候就要撤回3,回到1,2结点

  • 由于1,2阶段3已经被选择过了,所以继续撤销2,回退到1结点,这个阶段本可以选择2或者3,但是2已经选择过了,所以下一步就要选择3,得到1,3结点,之后再进行刚才的选择回退操作

这个树除了叶子结点以外,其他结点做的事情都是一样的,也就是在已经选了数 的前提下需要在剩下还没有选择的数里,按照顺序选择一棵树,所以这就是一个递归。那么递归终止的条件就是数字的个数已经选完了。所以我们需要一个变量来记录已经选了多少个数字,其实这个变量等价递归到了第几层depth,当遍历的层数和输入数组的个数相等的时候,所有的元素就都被考虑完了,就可以退出递归。

将已经选择的数放进一个列表里temp,这个其实就是树的路径,因为要不断地添加删除所以这个应该是个栈。在设置一个布尔数组used表示当前已经考虑的数字是否在之前

已经选择过,也就是判断是否在path变量里,初始化都为FALSE,表示都未被选择。

代码:

package mainfunc main() {}func permute(nums []int) [][]int  {    //保存输入数组的长度    nlen := len(nums)    //初始化,用来存放结果    var result [][]int    //如果传入长度为0,那就直接返回空数组(要对空列表进行初始化)    if nlen==0{        return result    }    //创建中间变量,存放临时结果    var temp []int    //创建bool值,判断该位置数字是否用过    used := make([]bool, nlen)    //回溯函数    BackTrack(used, temp, nums, &result,nlen,0)    return result}func BackTrack(used []bool, temp []int, nums []int, result *[][]int,nlen int,depth int) {    //判断回溯函数结束条件    //当临时temp长度和所给的数字长度相等时(也就是递归到了第几层),将该temp加入结果    if depth == nlen {        //由于go语言的特性如果不特别说明创建的切片本质上都是指向同一个内存空间        //如果想要循环赋值的切片与原来切片不相关,需要另外开辟空间,这里用到copy函数,开辟独立空间        current := make([]int, depth)        copy(current, temp)        *result = append(*result, current)    }    //遍历数组中的数字,进行排列组合    for i := 0; i < nlen; i++ {        //减枝,当该位置数字使用过时则跳过        if used[i] {            continue        }        //没有使用过就添加数字        temp = append(temp, nums[i])        //将该位置数字设置为访问过的状态        used[i] = true        //递归继续搜索该支线        BackTrack(used, temp, nums, result,nlen,depth+1)        //回溯,恢复到之前的状态        temp = temp[:len(temp)-1]        used[i] = false    }}

以上就是“go语言如何实现全排列”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: go语言如何实现全排列

本文链接: https://www.lsjlt.com/news/350979.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言如何实现全排列
    今天小编给大家分享一下go语言如何实现全排列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。思路:首先画出全排列的树形结构,以...
    99+
    2023-07-05
  • go语言实现全排列的示例代码
    目录思路:回溯过程:代码:思路: 首先画出全排列的树形结构,以123为例,一开始排列为空列表,第一个位置有三种可能,分别是1、2、3,画出三个分支;由于第一个位置已经被占用,那么第二...
    99+
    2023-03-07
    go语言全排列
  • c语言回溯全排列怎么实现
    可以使用递归的方式实现回溯法求全排列。具体步骤如下:1. 定义一个递归函数 `backtrack()`,该函数有两个参数:`nums...
    99+
    2023-09-08
    c语言
  • c语言全排列算法怎么实现
    以下是一个用C语言实现全排列的算法示例: #include <stdio.h> #include <string....
    99+
    2024-04-02
  • 如何用Go语言生成一个排列
    如何用Go语言生成一个排列,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。算法目前,生成一个序列的...
    99+
    2024-04-02
  • Java算法如何实现全排列
    本篇内容主要讲解“Java算法如何实现全排列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java算法如何实现全排列”吧!算法一基于递归与回溯实现。在排列1,2,3的时候,先由3向上回溯到2发现...
    99+
    2023-07-02
  • go语言堆排序怎么实现
    Go语言堆排序的实现步骤如下: 首先,定义一个用于进行堆调整的函数 adjustHeap,该函数接受三个参数:待调整的切片 arr...
    99+
    2023-10-22
    go语言
  • 如何用Go语言和Redis实现任务队列
    如何用Go语言和Redis实现任务队列引言:在实际的软件开发中,经常会遇到需要处理大量任务的场景。为了提高处理效率和可靠性,我们可以使用任务队列来分发和执行这些任务。本文将介绍如何使用Go语言和Redis实现一个简单的任务队列,以及具体的代...
    99+
    2023-10-26
    Go语言 redis 任务队列
  • Java语言如何实现队列
    这篇文章主要介绍了Java语言如何实现队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。队列队列是一种特殊的线性表,只允许在表的前端进行删除操作,在表的后端进行插入操作。队列...
    99+
    2023-06-29
  • C语言如何实现队列
    这篇文章主要介绍了C语言如何实现队列的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言如何实现队列文章都会有所收获,下面我们一起来看看吧。一. 什么是队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端...
    99+
    2023-07-02
  • c语言全排列数怎么生成
    生成C语言全排列数的一种常见方法是使用递归。以下是一个示例代码: #include // 交换两个元素的值 void swap(...
    99+
    2023-10-21
    c语言
  • Go语言如何实现多态 
    这篇“Go语言如何实现多态 ”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言如何实现多态 ”文章吧...
    99+
    2023-06-30
  • 如何用 Go 语言实现 SCP
    随着数据传输的不断增长,传输大量数据时如何确保数据安全和传输效率变得越来越重要。SCP (Secure Copy Protocol)是一种安全传输文件的协议,与SSH (Secure Shell)一起使用。本文将介绍如何用 Go 语言实现 ...
    99+
    2023-05-14
  • Go语言中锁如何实现
    今天小编给大家分享一下Go语言中锁如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Lock// Lock&n...
    99+
    2023-07-05
  • html语言如何实现图文混排
    本文将为大家详细介绍“html语言如何实现图文混排”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“html语言如何实现图文混排”能够给你意想不到的收获,请大家跟着小编的思路慢慢...
    99+
    2024-04-02
  • C语言如何实现快速排序
    今天小编给大家分享一下C语言如何实现快速排序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。交换排序的思想基本思想:所谓交换,...
    99+
    2023-07-02
  • go语言数组怎么实现队列
    在Go语言中,可以使用切片来实现队列。 首先,定义一个结构体来表示队列: type Queue struct { items...
    99+
    2024-02-29
    go语言
  • C++怎么实现全排列
    这篇文章主要讲解了“C++怎么实现全排列”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么实现全排列”吧!Permutations 全排列Given a collection of&n...
    99+
    2023-06-20
  • C语言中如何实现桶排序
    目录C语言实现桶排序1.原理2.桶排序不是基于比较的排序3.桶的实现形式4.桶中元素的排序4.最后就是将桶中的元素依次输出5完整代码如下7.桶排序的时间复杂度和空间复杂度【排序】图解...
    99+
    2022-11-16
    C语言桶排序 C桶排序 C语言排序
  • c语言如何实现排序算法
    小编给大家分享一下c语言如何实现排序算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.选择排序-简单选择排序选择排序是最简单的一种基于O(n2)时间复杂度的排...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作