HOME

TheInfoList



OR:

In
computer science Computer science is the study of computation, information, and automation. Computer science spans Theoretical computer science, theoretical disciplines (such as algorithms, theory of computation, and information theory) to Applied science, ...
, the Tak function is a recursive function, named after . It is defined as follows: \tau (x,y,z) = \begin \tau (\tau (x-1,y,z) ,\tau (y-1,z,x) ,\tau (z-1,x,y) ) & \text y < x \\ z & \text \end def tak(x: int, y: int, z: int) -> int: if y < x: return tak( tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y) ) else: return z This function is often used as a benchmark for languages with optimization for
recursion Recursion occurs when the definition of a concept or process depends on a simpler or previous version of itself. Recursion is used in a variety of disciplines ranging from linguistics to logic. The most common application of recursion is in m ...
.


tak() vs. tarai()

The original definition by Takeuchi was as follows: def tarai(x: int, y: int, z: int) -> int: if y < x: return tarai( tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y) ) else: return y # not z! tarai is short for in Japanese. John McCarthy named this function tak() after Takeuchi. However, in certain later references, the y somehow got turned into the z. This is a small, but significant difference because the original version benefits significantly from
lazy evaluation In programming language theory, lazy evaluation, or call-by-need, is an evaluation strategy which delays the evaluation of an Expression (computer science), expression until its value is needed (non-strict evaluation) and which avoids repeated eva ...
. Though written in exactly the same manner as others, the
Haskell Haskell () is a general-purpose, statically typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research, and industrial applications, Haskell pioneered several programming language ...
code below runs much faster. tarai :: Int -> Int -> Int -> Int tarai x y z , x <= y = y , otherwise = tarai (tarai (x-1) y z) (tarai (y-1) z x) (tarai (z-1) x y) One can easily accelerate this function via memoization yet lazy evaluation still wins. The best known way to optimize tarai is to use a mutually recursive helper function as follows. def laziest_tarai(x: int, y: int, zx: int, zy: int, zz: int) -> int: if not y < x: return y else: return laziest_tarai( tarai(x-1, y, z), tarai(y-1, z, x), tarai(zx, zy, zz)-1, x, y) def tarai(x: int, y: int, z: int) -> int: if not y < x: return y else: return laziest_tarai( tarai(x-1, y, z), tarai(y-1, z, x), z-1, x, y) Here is an efficient implementation of tarai() in C: int tarai(int x, int y, int z) Note the additional check for (x <= y) before z (the third argument) is evaluated, avoiding unnecessary recursive evaluation.


References


External links

*
TAK Function
{{Benchmark Articles with example C code Articles with example Haskell code Articles with example Python (programming language) code Functions and mappings Special functions