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) を次のコードに置き換えます。
リーリー
詳細については、「
以上がこれらのタプルが正しく生成されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。