Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Tak (function)

From Wikipedia, the free encyclopedia
Recursive function

Incomputer science, theTak function is arecursive function, named afterIkuo Takeuchi [ja]. It is defined as follows:

τ(x,y,z)={τ(τ(x1,y,z),τ(y1,z,x),τ(z1,x,y))if y<xzotherwise{\displaystyle \tau (x,y,z)={\begin{cases}\tau (\tau (x-1,y,z),\tau (y-1,z,x),\tau (z-1,x,y))&{\text{if }}y<x\\z&{\text{otherwise}}\end{cases}}}

deftak(x:int,y:int,z:int)->int:ify<x:returntak(tak(x-1,y,z),tak(y-1,z,x),tak(z-1,x,y))else:returnz

This function is often used as abenchmark for languages with optimization forrecursion.[1][2][3][4]

tak() vs. tarai()

[edit]
icon
This sectionneeds additional citations forverification. Please helpimprove this article byadding citations to reliable sources in this section. Unsourced material may be challenged and removed.
Find sources: "Tak" function – news ·newspapers ·books ·scholar ·JSTOR
(September 2023) (Learn how and when to remove this message)

The original definition by Takeuchi was as follows:

deftarai(x:int,y:int,z:int)->int:ify<x:returntarai(tarai(x-1,y,z),tarai(y-1,z,x),tarai(z-1,x,y))else:returny# not z!

tarai is short forたらい回し (tarai mawashi, "to pass around") in Japanese.

John McCarthy named this function tak() after Takeuchi.[5]

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 fromlazy evaluation.

Though written in exactly the same manner as others, theHaskell code below runs much faster.

tarai::Int->Int->Int->Inttaraixyz|x<=y=y|otherwise=tarai(tarai(x-1)yz)(tarai(y-1)zx)(tarai(z-1)xy)

One can easily accelerate this function viamemoization yet lazy evaluation still wins.

The best known way to optimize tarai is to use a mutually recursive helper function as follows.

deflaziest_tarai(x:int,y:int,zx:int,zy:int,zz:int)->int:ifnoty<x:returnyelse:returnlaziest_tarai(tarai(x-1,y,z),tarai(y-1,z,x),tarai(zx,zy,zz)-1,x,y)deftarai(x:int,y:int,z:int)->int:ifnoty<x:returnyelse:returnlaziest_tarai(tarai(x-1,y,z),tarai(y-1,z,x),z-1,x,y)

Here is an efficient implementation of tarai() in C:

inttarai(intx,inty,intz){while(x>y){intoldx=x,oldy=y;x=tarai(x-1,y,z);y=tarai(y-1,z,oldx);if(x<=y)break;z=tarai(z-1,oldx,oldy);}returny;}

Note the additional check for (x <= y) before z (the third argument) is evaluated, avoiding unnecessary recursive evaluation.

References

[edit]
  1. ^Peter Coffee (1996). "Tak test stands the test of time".PC Week.13 (39).
  2. ^"Recursive Methods"by Elliotte Rusty Harold
  3. ^Johnson-Davies, David (June 1986)."Six of the Best Against the Clock".Acorn User. pp. 179,181–182. Retrieved28 October 2020.
  4. ^Johnson-Davies, David (November 1986)."Testing the Tak".Acorn User. pp. 197, 199. Retrieved28 October 2020.
  5. ^John McCarthy (December 1979). "An Interesting LISP Function".ACM Lisp Bulletin (3):6–8.doi:10.1145/1411829.1411833.S2CID 31639459.

External links

[edit]
Processingbenchmarks
Concepts
Organizations
Processor
Floating-point unit (FLOPS)
Integer (ALU)
Digital signal processor (DSP)
  • BTDi
Graphics processing unit (GPU)
Parallel computing
Peripherals
Network
  • BreakingPoint Systems
  • SUPS
Filesystems and storage
Computer memory
Input/output
Computer system (entire)
Energy consumption
Software
JavaScript engine
Cryptography
Multiuser system
Virtual machine
Recursion performance
Database transactions
Web server benchmarking
Platform specific
Retrieved from "https://en.wikipedia.org/w/index.php?title=Tak_(function)&oldid=1301932557"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2026 Movatter.jp