これらのタプルが正しく生成されないのはなぜですか?

WBOY
リリース: 2024-02-09 10:00:11
転載
968 人が閲覧しました

これらのタプルが正しく生成されないのはなぜですか?

php エディター Apple は、コードを作成するときに、しばしばいくつかの問題に遭遇します。一般的な問題の 1 つは、タプルの不正な生成です。これは、コードの論理エラー、データ型の不一致、またはその他のエラーが原因である可能性があります。この問題を解決する前に、コードを注意深く分析し、考えられるエラー ポイントを見つけて、それらを 1 つずつトラブルシューティングする必要があります。問題が見つかった場合にのみ、タプルが正しく生成されてコードが正常に動作するように、対応する修復を行うことができます。

質問内容

私は、(複数の)数値のセットから特定の長さの可能なすべてのタプルを生成する必要があるプロジェクトに取り組んでいます。これを行うために、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 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!