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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎順列: FilterはPermutationの実装に使わなかったので削除
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎組合わせ: {{See also|JavaScript/オブジェクト#順列を求めるメソッドを配列に追加する|JavaScript/オブジェクト#組合わせを求めるメソッドを配列に追加する}}
タグ: 2017年版ソースエディター
376 行
=== 順列・組合わせ ===
==== 順列 ====
;[https://go2goplay.golang.org/p/FtOGcqVIimaELwv4XCz9N6 順列]:<syntaxhighlight lang="go" line>
package main
 
402 行
sf = append(sf, w)
}
srfor _, w := range Permutation(sf, n-1) {
for _, w := range sr {
result = append(result, append(w, v))
}
422 ⟶ 421行目:
</syntaxhighlight>
;解説
:オーソドックスな再帰的な関数呼び出しを使って順列を求めるプログラムです。
:スライスの要素型は型パラメーター化しているので、このコードで任意の型のスライスに対応できます。
 
==== 組合わせ ====
;[https://go2goplay.golang.org/p/t5-TWxVpIMJ 組合わせ]:<syntaxhighlight lang="go" line>
package main
 
import (
"fmt"
)
 
func Combination[T any](s []T, n int) [][]T {
if s == nil {
panic("Permutation(): s == nil")
}
result := [][]T{}
if n == 1 {
for _, wv := range srs {
result = append(result, []T{v})
}
return result
}
for i, v := range s {
for _, w := range Combination(s[i+1:], n-1) {
result = append(result, append(w, v))
}
}
return result
}
 
func main() {
fmt.Println(Combination([]int{1, 2, 3}, 1))
fmt.Println(Combination([]int{0, 1, 2}, 2))
fmt.Println(Combination([]string{"abc", "def", "xyz"}, 3))
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
[[1] [2] [3]]
[[1 0] [2 0] [2 1]]
[[xyz def abc]]
</syntaxhighlight>
;解説
:再帰的な関数呼び出しを使って組合わせを求めるプログラムです。
:スライスの要素型は型パラメーター化しているので、このコードで任意の型のスライスに対応できます。
:この2つの関数は、JavaScriptで書かれた順列・組合わせのコードを Go に移植したものですが、JavaScriptでは組込みオブジェクトArrayにメソッドを追加する形で実装し内部でもメソッドチェーンを多用しているのに対し、Go版では読み間違えのないようなforループで実装しました。単純にロジックの追いやすさの比較では、Go版に軍配が上がります。
 
{{See also|JavaScript/オブジェクト#順列を求めるメソッドを配列に追加する|JavaScript/オブジェクト#組合わせを求めるメソッドを配列に追加する}}
 
== 脚註 ==