2017-11-03 2 views
0

Kombinationen können unter Verwendung des folgenden rekursiven Code (von Rosetta inspiriert)Wie rekursiv erhaltene Kombinationen in einem Slice in GO gespeichert werden?

dachte ich es wäre bedruckenden einfach, die Zwischenergebnisse in einem [] int oder die Menge der Kombination in einem [] [] int zu speichern. Aber, da die Funktion rekursiv ist, ist es nicht so einfach als Ersatz die

fmt.Println(s) 

von einem

return s 

mit einer geringfügigen Änderung des Funktionsausganges zum Beispiel. Ich habe auch versucht, wie ein Zeiger zu füttern

p *[][]int 

mit der Variablen „s“ in der rekursiven Funktion, aber ich schlug fehl: -/

Ich denke, es ist ein generelles Problem mit rekursiven Funktionen also, wenn Sie Einige raten, dieses Problem zu lösen, es wird mir sehr helfen!

Vielen Dank im Voraus! ;)

package main 

import (
    "fmt" 
) 

func main() { 

    comb(5, 3) 
} 

func comb(n, m int) { 

    s := make([]int, m) 
    last := m - 1 
    var rc func(int, int) 
    rc = func(i, next int) { 
     for j := next; j < n; j++ { 
      s[i] = j 
      if i == last { 
       fmt.Println(s) 
      } else { 
       rc(i+1, j+1) 
      } 
     } 
     return 
    } 
    rc(0, 0) 
} 

Antwort

2

mir scheint, dass s von jedem rc Anruf wiederverwendet werden, so dass Sie müssen nur sicherstellen, dass bei der Lagerung s in eine [][]int Sie seine Kopie speichern, um seinen Inhalt nicht während der nächsten Iteration überschreiben .

eine Scheibe kopieren Sie anhängen wie diese verwenden:

scopy := append([]int{}, s...) 

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

package main 

import (
    "fmt" 
) 

func main() { 

    out := comb(5, 3) 
    fmt.Println(out) 
} 

func comb(n, m int) (out [][]int) { 

    s := make([]int, m) 
    last := m - 1 

    var rc func(int, int) 
    rc = func(i, next int) { 

     for j := next; j < n; j++ { 
      s[i] = j 
      if i == last { 
       out = append(out, append([]int{}, s...)) 
      } else { 
       rc(i+1, j+1) 
      } 
     } 
     return 
    } 
    rc(0, 0) 

    return out 
} 
+0

Nizza Lösung @mkopriva! Vielen Dank ! – Fred

Verwandte Themen