swift
1import Foundation
2precedencegroup Composition {
3 associativity: right
4 lowerThan: BitwiseShiftPrecedence
5}
6infix operator~>: Composition
7func ~>(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double {
8 return {(x: Double) in f(g(x))}
9}
10func +(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double {
11 return {(x: Double) in f(x) + g(x)}
12}
13func -(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double {
14 return {(x: Double) in f(x) - g(x)}
15}
16func *(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double {
17 return {(x: Double) in f(x) * g(x)}
18}
19func /(f: @escaping (Double) -> Double, g: @escaping (Double) -> Double) -> (Double) -> Double {
20 return {(x: Double) in f(x) / g(x)}
21}
22
23func functionGenerator(_ seed: Int, _ depth: Int = 0) -> (Double) -> Double {
24 if (depth == 10) {return {$0}}
25 if (/*condition 1*/) {
26 /*本当はseedを変えて再帰すべき*/
27 return functionGenerator (seed, depth + 1) + functionGenerator (seed, depth + 1)
28 }else if (/*condition 2*/) {
29 return functionGenerator (seed, depth + 1) * functionGenerator (seed, depth + 1)
30 }else if (/*condition 3*/) {
31 return log ~> functionGenerator (seed, depth + 1)
32 }else if (/*condition 4*/) {
33 return sqrt ~> functionGenerator (seed, depth + 1)
34 }else {
35 return abs ~> functionGenerator (seed, depth + 1)
36 }
37}
コードがSwiftになってたので一応Swiftで書いてみました。
だいぶ細かい部分は省略してるのでわかりづらいとは思いますが、こんな感じで再帰的にジェネレーターを呼び出して、合成すると複雑な関数になると思います。
関数を返すのではなく具体的なxの値で計算させる場合も、同様に再帰的に計算させれば同じことができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。