RosettaCodeData/Task/Pascal-matrix-generation/Go/pascal-matrix-generation.go

82 lines
1.6 KiB
Go

package main
import (
"fmt"
"strings"
)
func binomial(n, k int) int {
if n < k {
return 0
}
if n == 0 || k == 0 {
return 1
}
num := 1
for i := k + 1; i <= n; i++ {
num *= i
}
den := 1
for i := 2; i <= n-k; i++ {
den *= i
}
return num / den
}
func pascalUpperTriangular(n int) [][]int {
m := make([][]int, n)
for i := 0; i < n; i++ {
m[i] = make([]int, n)
for j := 0; j < n; j++ {
m[i][j] = binomial(j, i)
}
}
return m
}
func pascalLowerTriangular(n int) [][]int {
m := make([][]int, n)
for i := 0; i < n; i++ {
m[i] = make([]int, n)
for j := 0; j < n; j++ {
m[i][j] = binomial(i, j)
}
}
return m
}
func pascalSymmetric(n int) [][]int {
m := make([][]int, n)
for i := 0; i < n; i++ {
m[i] = make([]int, n)
for j := 0; j < n; j++ {
m[i][j] = binomial(i+j, i)
}
}
return m
}
func printMatrix(title string, m [][]int) {
n := len(m)
fmt.Println(title)
fmt.Print("[")
for i := 0; i < n; i++ {
if i > 0 {
fmt.Print(" ")
}
mi := strings.Replace(fmt.Sprint(m[i]), " ", ", ", -1)
fmt.Print(mi)
if i < n-1 {
fmt.Println(",")
} else {
fmt.Println("]\n")
}
}
}
func main() {
printMatrix("Pascal upper-triangular matrix", pascalUpperTriangular(5))
printMatrix("Pascal lower-triangular matrix", pascalLowerTriangular(5))
printMatrix("Pascal symmetric matrix", pascalSymmetric(5))
}