> 백엔드 개발 > Golang > 이러한 튜플이 올바르게 생성되지 않는 이유는 무엇입니까?

이러한 튜플이 올바르게 생성되지 않는 이유는 무엇입니까?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2024-02-09 10:00:11
앞으로
1039명이 탐색했습니다.

이러한 튜플이 올바르게 생성되지 않는 이유는 무엇입니까?

PHP 편집기 Apple은 코드를 작성할 때 종종 몇 가지 문제에 직면합니다. 일반적인 문제 중 하나는 잘못된 튜플 생성입니다. 이는 코드 논리 오류, 데이터 유형 불일치 또는 기타 오류로 인해 발생할 수 있습니다. 이 문제를 해결하기 전에 코드를 주의 깊게 분석하고, 가능한 오류 지점을 찾아 하나씩 문제를 해결해야 합니다. 문제가 발견된 경우에만 코드의 정상적인 작동을 보장하기 위해 튜플이 올바르게 생성되도록 해당 복구를 수행할 수 있습니다.

질문 내용

저는 (복수) 숫자 집합에서 특정 길이의 가능한 모든 튜플을 생성해야 하는 프로젝트를 진행하고 있습니다. 이를 위해 Mathematica의 Tuples[] 명령 버전을 구현하려고 시도했지만 모든 튜플을 올바르게 생성하지 못하는 것을 발견했습니다.

많은 좌절 끝에 나는 내 프로그램이 길이가 4인 튜플을 생성할 때 새 요소 대신 중복 항목을 추가하여 길이가 더 긴 튜플에 문제를 일으킨다는 사실을 발견했습니다. 나는 누군가 다른 비슷한 문제가 있는지 알아보기 위해 온라인을 살펴보고 동일한 작업을 수행하기 위한 다른 코드를 찾았으며 내 솔루션이 그들의 솔루션과 유사하다는 것을 알았습니다. 나에게 무슨 문제가 있는지 모르겠습니다.

더 좌절한 끝에 목록에 요소를 추가하면 모든 것이 잘 작동하지만 추가만 문제가 된다는 것을 알았습니다. 원래 코드에 어떤 문제가 있는지 알아내려고 노력했지만 아무 것도 발견하지 못했습니다.

아래는 문제를 보여주기 위해 제가 작성한 코드입니다. 나는 결코 전문 코더가 아니기 때문에 이것이 이 작업을 수행하는 가장 관용적인 방법이 아니라면 나를 용서해야 합니다. 현재 실제 코드에서 tuplesByPrepend 함수를 사용하고 있는데 잘 작동합니다. tuplesByAppend 함수에 어떤 문제가 있는지 이해하고 싶습니다. 마찬가지로, 3번째, 5번째, 8번째 및 제가 테스트한 다른 모든 레벨에서 좋은 성능을 보이는 것 같았습니다. 필요한 경우 내 OS 및 빌드에 대한 자세한 정보를 제공할 수 있습니다.

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)를 다음 코드로 바꾸세요.

으아악

자세한 내용은 Go 슬라이스: 사용법 및 내부를 참조하세요.

위 내용은 이러한 튜플이 올바르게 생성되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿