Божидар обнови решението на 22.10.2018 00:25 (преди 10 месеца)
+package main
+
+import "fmt"
+
+func Repeater(s, sep string) func(int) string {
+
+ return func(cnt int) string {
+ var result string = ""
+
+ for i := 0; i < cnt; i++ {
+
+ result += s
+
+ if i != cnt-1 {
+ result += sep
+ }
+ }
+ return result
+ }
+}
+
+func Generator(gen func(int) int, initial int) func() int {
+
+ next := initial
+
+ return func() int {
+ prev := next
+ next = gen(next)
+ return prev
+ }
+}
+
+func MapReducer(mapper func(int) int, reducer func(int, int) int, initial int) func(...int) int {
+
+ return func(args ...int) int {
+
+ cntOfArgs := len(args)
+
+ if cntOfArgs == 0 {
+ return initial
+ } else {
+ return reducer(mapper(args[0]), MapReducer(mapper, reducer, initial)(args[1:]...))
Това не е точно алгоритъма който трябва да се имплементира - погледни линкнатите wikipedia статии в условието. Също така може да се опиташ да го имплементираш без рекурсия :)
+ }
+
+ }
+
+}
+
+func main() {
това ако може да да го махнеш. Ако искаш да имаш main който да може да му виждаш изхода може да си направи друг файл в същата папка в който да го сложиш и да викащ go run .
+
+ fmt.Println(Repeater("re", "peat")(4))
+ fmt.Println(Repeater("", ":")(2))
+ fmt.Println(Repeater("empty", ":")(0))
+ fmt.Println(Repeater("no ", "idea")(-4))
+
+ counter := Generator(func(v int) int { return v + 1 }, 0)
+ power := Generator(func(v int) int { return v * v }, 2)
+
+ fmt.Println(counter())
+ fmt.Println(counter())
+ fmt.Println(power())
+ fmt.Println(power())
+ fmt.Println(counter())
+ fmt.Println(power())
+ fmt.Println(power())
+
+ powerSum := MapReducer(
+ func(v int) int { return v * v },
+ func(a, v int) int { return a + v },
+ 0)
+
+ fmt.Println(powerSum(1, 2, 3, 4)) // 30
+}