Skip to content

Instantly share code, notes, and snippets.

@ikbear
Last active September 12, 2015 17:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ikbear/1f8f7aed736eced5c025 to your computer and use it in GitHub Desktop.
Save ikbear/1f8f7aed736eced5c025 to your computer and use it in GitHub Desktop.
从 n 个数中选择 m 个的组合(n >= m)
package main
import "fmt"
func main() {
fmt.Println(f(5, 3))
}
func f(n, m int) int {
if n <= 0 || m <= 0 {
return 0
}
if m == 1 {
return n
} else {
return f(n-1, m-1) + f(n-1, m)
}
}
@ikbear
Copy link
Author

ikbear commented Sep 12, 2015

把组合打印出来:

package main

import "fmt"

func main() {
    a := []int{1, 2, 3, 4, 5, 6, 7}
    f(a, []int{}, 3)
}

func f(a, b []int, m int) {
    n := len(a)
    if n <= 0 || m <= 0 {
        return
    }
    if m == 1 { // 递归中止条件,从 n 个中取 1 个,都取,依次取
        for _, v := range a {
            fmt.Println(append(b, v))
        }
        return
    }
    f(a[1:n], append(b, a[0]), m-1) // 第一个数在组合中
    f(a[1:n], b, m) // 第一个数不在组合中
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment