为什么这些元组没有正确生成?
php小编苹果在编写代码时,经常会遇到一些问题,其中一个常见问题是元组生成不正确的情况。这可能是由于代码逻辑错误、数据类型不匹配或者其他错误导致的。在解决这个问题之前,我们需要先仔细分析代码,查找可能的错误点,并逐一排查。只有找到问题所在,才能进行相应的修复,确保元组正确生成,以保证代码的正常运行。
问题内容
我一直在从事一个项目,该项目要求我从一组(复数)数字生成特定长度的所有可能的元组。为此,我尝试实现 Mathematica Tuples[] 命令的一个版本,但发现它没有正确生成所有元组。
经过多次挫折,我发现当我的程序生成长度为 4 的元组时,它会添加重复项而不是新元素,从而导致任何更长长度的元组出现问题。我在网上查看是否有人有任何其他类似的问题,然后找到了一些其他代码来完成相同的任务,并注意到我的解决方案与他们的类似。我不知道自己哪里出了问题。
经过更多的挫折后,我发现如果我将元素添加到列表中,一切都会正常工作,只有附加才是问题所在。我试图找出我的原始代码有什么问题,但一无所获。
下面是我为演示该问题而编写的代码。我绝不是一个专业的编码员,所以如果这不是完成这项任务的最惯用的方法,你必须原谅我。目前,我在实际代码中使用 tuplesByPrepend 函数,它工作得很好,我真的只是希望了解 tuplesByAppend 函数出了什么问题。同样,在我测试过的第三、第五、第八和任何其他级别上,它似乎都表现良好。如果需要的话,我可以提供有关我的操作系统和构建以及所有这些的更多信息。
package main import "fmt" func tuplesByAppend[T any](list []T, depth int) [][]T { var l1 [][]T var l2 [][]T for _, v := range list { l1 = append(l1, []T{v}) } for i := 1; i < depth; i++ { for _, u := range l1 { for _, v := range list { // Differs here next := append(u, v) // next is calculated properly, but added to l2 incorrectly at the fourth level only // at the fifth level it functions properly // fmt.Println(next) l2 = append(l2, next) // fmt.Println(l2) // it appears that at the fourth level it is writing over the previous entries // Printing here yields // [[1 1 1 1]] // [[1 1 1 2] [1 1 1 2]] // [[1 1 1 3] [1 1 1 3] [1 1 1 3]] // [[1 1 1 3] [1 1 1 3] [1 1 1 3] [1 1 2 1]] // [[1 1 1 3] [1 1 1 3] [1 1 1 3] [1 1 2 2] [1 1 2 2]] // and so on. } } l1 = l2 l2 = [][]T{} } return l1 } func tuplesByPrepend[T any](list []T, depth int) [][]T { var l1 [][]T var l2 [][]T for _, v := range list { l1 = append(l1, []T{v}) } for i := 1; i < depth; i++ { for _, u := range l1 { for _, v := range list { // Differs here next := append([]T{v}, u...) l2 = append(l2, next) } } l1 = l2 l2 = [][]T{} } return l1 } func main() { ourlist := []int{1, 2, 3} ourdepth := 4 appended := tuplesByAppend(ourlist, ourdepth) prepended := tuplesByPrepend(ourlist, ourdepth) // We should expect this slice to start [1 1 1 1] [1 1 1 2] [1 1 1 3] [1 1 2 1] ... // In fact, it starts [1 1 1 3] [1 1 1 3] [1 1 1 3] [1 1 2 3] fmt.Println(appended) // This slice is as expected fmt.Println(prepended) }
解决方法
在某些情况下,以下行无法按您的预期工作:
next := append(u, v)
此示例演示了发生的情况:
package main import "fmt" func main() { u := append([]int{1, 2}, 3) // The length is 3 but the capacity is 4. fmt.Printf("u %v\n len: %d\n cap: %d\n", u, len(u), cap(u)) // Since u has enough capacity for the new element "4", // v1 will share the same underlying array. v1 := append(u, 4) fmt.Println("v1:", v1) // As what happened to v1, v2 will share the same underlying array too. // But the last element "4" in the underlying array is changed to "5". v2 := append(u, 5) fmt.Println("v2:", v2) // Since v1 uses the same underlying array, it sees the change in the last step. fmt.Println("v1:", v1) }
要防止它共享底层数组,请将 next :=append(u, v)
替换为以下代码:
next := make([]T, len(u)+1) copy(next, u) next[len(u)] = v
请参阅 Go Slices:用法和内部原理了解更多信息。
以上是为什么这些元组没有正确生成?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Go语言在构建高效且可扩展的系统中表现出色,其优势包括:1.高性能:编译成机器码,运行速度快;2.并发编程:通过goroutines和channels简化多任务处理;3.简洁性:语法简洁,降低学习和维护成本;4.跨平台:支持跨平台编译,方便部署。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。

C 更适合需要直接控制硬件资源和高性能优化的场景,而Golang更适合需要快速开发和高并发处理的场景。1.C 的优势在于其接近硬件的特性和高度的优化能力,适合游戏开发等高性能需求。2.Golang的优势在于其简洁的语法和天然的并发支持,适合高并发服务开发。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。
