2013-04-25 54 views
5

Tôi đã tự hỏi liệu có cách nào để tìm tất cả các hoán vị của một lát chứa đầy các ký tự trong Go không?Nhận tất cả các hoán vị của một slice

Trong Python bạn có thể sử dụng itertools.product với danh sách hoặc ký tự hoặc số nguyên và bạn có thể nhận được tất cả các hoán vị có thể.

Tôi đã xem xét xem có gói nào không và tôi dường như không tìm thấy gói nào. Bất kỳ trợ giúp sẽ được hoan nghênh.

+2

'itertools.product' mang đến cho bạn sản phẩm Descartes của một số bộ. Nó * không * cung cấp cho bạn hoán vị. Mặc dù bạn có thể sử dụng các sản phẩm Descartes để tìm ra các hoán vị, điều đó sẽ không hiệu quả khủng khiếp. http://docs.python.org/2/library/itertools.html#itertools.product – scvalex

+0

Tôi là một thằng ngốc. Tôi luôn luôn nhận được những hỗn hợp, và tôi tìm thấy một gói cho các sản phẩm Descartes. Cảm ơn – Colum

+1

@Colum Bạn đã phạm sai lầm; điều đó không làm cho bạn thành kẻ ngốc. –

Trả lời

0

Đây là một thực hiện một chức năng hoán vị tôi đã viết ...

https://github.com/itcraftsman/GoPermutation

func permutate(slice [][]int) (permutations [][][]int){ 
    f := fac(len(slice)) 
    for i := 0; i < len(slice); i++ { 
     elem, s := splice(slice, i) 
     pos := 0 
     for count := 0; count < (f/len(slice)); count++{ 
      if pos == (len(s) -1) { 
       pos = 0 
      } 
      s = swap(s, pos, pos +1) 
      permutation := make([][]int, len(slice)) 
      permutation = s 
      permutation = append(permutation, elem) 
      permutations = append(permutations, permutation) 
      pos++ 
     } 
    } 
    return 
} 

phải mất một lát 2D như là đầu vào và trả về một lát 3D, nhưng bạn có thể dễ dàng thay đổi mã để hàm sẽ lấy một lát đơn giản làm đầu vào và trả về một lát 2D với tất cả các hoán vị

0

Không thực sự chắc chắn nếu điều này trả lời câu hỏi của bạn nhưng đây là một thực hiện đệ quy đơn giản để tìm đầu ra dưới đây.

package main 

import "fmt" 

func main() { 
    values := [][]int{} 

    // These are the first two rows. 
    row1 := []int{1, 2, 3} 
    row2 := []int{4, 5, 6} 
    row3 := []int{7, 8, 9} 

    // Append each row to the two-dimensional slice. 
    values = append(values, row1) 
    values = append(values, row2) 
    values = append(values, row3) 


    fmt.Println(getPermutation(values)) 
} 

func getPermutation(vids [][]int) [][]int { 
    toRet := [][]int{} 

    if len(vids) == 0 { 
     return toRet 
    } 

    if len(vids) == 1 { 
     for _, vid := range vids[0] { 
      toRet = append(toRet, []int{vid}) 
     } 
     return toRet 
    } 

    t := getPermutation(vids[1:]) 
    for _, vid := range vids[0] { 
     for _, perm := range t { 
      toRetAdd := append([]int{vid}, perm...) 
      toRet = append(toRet, toRetAdd) 
     } 
    } 

    return toRet 
} 

https://play.golang.org/p/f8wktrxkU0

Output của đoạn trên:

[[1 4 7] [1 4 8] [1 4 9] [1 5 7] [1 5 8] [1 5 9] [1 6 7] [1 6 8] [1 6 9] [2 4 7] [2 4 8] [2 4 9] [2 5 7] [2 5 8] [2 5 9] [2 6 7] [2 6 8] [2 6 9] [3 4 7] [3 4 8] [3 4 9] [3 5 7] [3 5 8] [3 5 9] [3 6 7] [3 6 8] [3 6 9]] 
Các vấn đề liên quan