Hi !

I have made a recursive algorithm to compute all the combinations between 
an unlimited number of slices. The algorithm does good results for 2 and 3 
slices.

For example with 3 slices a,b,c :

a := []int{1,2}
b := []int{3,4}
c := []int{5,6}
final comb [[1 3 5] [1 3 6] [1 4 5] [1 4 6] [2 3 5] [2 3 6] [2 4 5] [2 4 
6]] // good





, but I have a strange bug with 4 slices : only the last element of the 
slice 4 is recorded.


    a := []int{1,2}
    b := []int{3,4}
    c := []int{5,6}
    d := []int{7,8,9}
final comb [[1 3 5 9] [1 3 5 9] [1 3 5 9] [1 3 6 9] [1 3 6 9] [1 3 6 9] [1 
4 5 9] [1 4 5 9]
[1 4 5 9] [1 4 6 9] [1 4 6 9] [1 4 6 9] [2 3 5 9] [2 3 5 9] [2 3 5 9] [2 3 
6 9] [2 3 6 9]
[2 3 6 9] [2 4 5 9] [2 4 5 9] [2 4 5 9] [2 4 6 9] [2 4 6 9] [2 4 6 9]] 
// bad result, the combination [1 3 5 7] and [1 3 5 8] are missing

The error occurs between these 2 steps
c1 := append(c, s)
temp = append(temp, c1)

when  c1 is appended to temp, 
i,j,k = 2, 0, 0 - temp = [[1 3 5 7]]

 [[1 3 5 7]] is replaced by [1 3 5 8] inside the loop and [1 3 5 7] 
combination is lost !
i,j,k =2, 0, 1 - temp = [[1 3 5 8] [1 3 5 8]]
i,j,k =2, 0, 2 - temp = [[1 3 5 9] [1 3 5 9] [1 3 5 9]]


Here is the algorithm. With 5 slices the results are good except for the 
slice 4 combinations. I did not found the bug, if you see it,  thank you 
for your help !

package main

import (
    "fmt"
)

func main() {
    a := []int{1,2}
    b := []int{3,4}
    c := []int{5,6}
    d := []int{7,8,9}
    //e := []int{1,2}   
    
    seq := [][]int{a, b, c, d} // slice to combine with comb [[b1 b2] [c1 
c2 c3]]

    fmt.Println("final comb ", combIntSlices(seq) )
}

// function to build the combinations
func combIntSlices(seq [][]int) (out [][]int) {
    
        // fill combSeq with the first slice of seq
        var combSeq [][]int // combSeq is the initial [][]int, for example 
[[1] [2] [3]]
        for _, i := range seq[0] {
            combSeq = append(combSeq, []int{i})
        }
    
        seq = seq[1:] // seq is the [][]slice to combine with combSeq [[4 
5] [6 7 8]]
        fmt.Println(seq, len(seq))

        // rec recursive funtion
        var rec func(int, [][]int, [][]int)
        rec = func(i int, seq, combSeq [][]int) {
    
            var temp [][]int // temporary slice to append combinations

            last := len(seq) - 1
    
            fmt.Println(combSeq, "-", seq)
            for j, c := range combSeq { // for each slice in combSeq slice
                for k, s := range seq[i] { // append each element of the 
slice i in seq
                    c1 := append(c, s)
                    temp = append(temp, c1)
                    fmt.Println(i,j,k, "- temp =", temp, " c=", c)
                }
                combSeq = temp // at this step temp has recorded one round 
of combination
            }
            if i == last { // if the length of seq is reached, the solution 
is returned
                out = combSeq
                return
            } else {
                rec(i+1, seq, combSeq) // if the length of seq is not 
reached, rec is called to perform another step of combinations
            }
        }
        rec(0, seq, combSeq) // start the first step of combinations
        return out
    }

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Attachment: combin-5.go
Description: Binary data

Reply via email to