「Go/関数」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
373 行
func Filter[T any](s []T, f func(T) bool) []T {
</syntaxhighlight>
 
=== 順列・組合わせ ===
==== 順列 ====
;[https://go2goplay.golang.org/p/PoocwjTvCG5 順列]:<syntaxhighlight lang="go" line>
package main
 
import (
"fmt"
)
 
func Filter[T any](s []T, f func(T) bool) []T {
result := []T{}
for _, v := range s {
if f(v) {
result = append(result, v)
}
}
return result
}
 
func Permutation[T any](s []T, n int) [][]T {
if s == nil {
panic("Permutation(): s == nil")
}
result := [][]T{}
if n == 1 {
for _, v := range s {
result = append(result, []T{v})
}
return result
}
for i, v := range s {
sf := []T{}
for j, w := range s {
if j == i {
continue
}
sf = append(sf, w)
}
sr := Permutation(sf, n-1)
for _, w := range sr {
result = append(result, append(w, v))
}
}
return result
}
 
func main() {
fmt.Println(Filter([]int{1, 2, 3, 4, 5}, func(x int) bool { return x%2 == 0 }))
fmt.Println(Permutation([]int{1, 2, 3}, 1))
fmt.Println(Permutation([]int{0, 1, 2}, 2))
fmt.Println(Permutation([]string{"abc", "def", "xyz"}, 3))
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
[2 4]
[[1] [2] [3]]
[[1 0] [2 0] [0 1] [2 1] [0 2] [1 2]]
[[xyz def abc] [def xyz abc] [xyz abc def] [abc xyz def] [def abc xyz] [abc def xyz]]
</syntaxhighlight>
;解説
:オーソドックスな再帰的な関数呼び出しを使って順列を求めるプログラムです。
:スライスの要素型は型パラメーター化しているので、このコードで任意の型のスライスに対応できます。
 
== 脚註 ==