Hyperoperations
Egy művelet mindenek felett… Picit átevezve az absztrakt matematika és csoport elmélet vizeire, most ne csak osztályokat származtassunk, hanem műveleteket is. Legyen a nulladik hiperművelet az értéknövelés egységgel. Ebből már eljuthatunk az összeadásig (valahány darab értéknövelés), a szorzásig (valahány darab összeadás), a hatványozásig (valahány darab szorzás), a tetrációig (valahány darab hatvány)… és még végtelen sokadfokú művelethez (egyelőre ugyan csak a természetes számok körében).
F# megvalósítás:
let rec hyper (left : int) (op : int) (right : int) : int = match (op, right) with | (0, _) -> right + 1 | (1, 0) -> left | (2, 0) -> 0 | (3, 0) -> 1 | _ -> hyper left (op - 1) (hyper left op (right - 1))
Legyen left az első, right a második operandus, op pedig a művelet fokszáma (összeadás: 1, szorzás: 2, …).
Példa:
let additionExample = hyper 2 1 3 // 5 let multipliationExample = hyper 2 2 3 // 6 let exponentiationExample = hyper 2 4 3 // 8 let tetrationExample = hyper 2 4 3 // 16
Ez a rekurzív megvalósítás egy hatalmas, már nem elfogadható kompromisszum, de szép.
Teljesen absztrakt, viszont csak nagyon kis számokkal tud dolgozni, mert különben szembekerülünk egy hatalmas StackOverflowExceptionnel.
A C# implementációt innen töltheted le.