Tak (function)

In computer science, the Tak function is a recursive function, named after Ikuo Takeuchi. 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{خلاف ذلك}}\end{الحالات}}}

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 a benchmark for languages with optimization for recursion.[1][2][3][4]

tak() vs. tarai()

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 from lazy evaluation.

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

tarai :: Int -> Int -> Int -> Int tarai x y z | س <= ص = ص | وإلا = تاراي ( تاراي ( x - 1 ) y z ) ( تاراي ( y - 1 ) z x ) ( تاراي ( z - 1 ) x y )

يمكن تسريع هذه الوظيفة بسهولة عن طريق التخزين المؤقت، لكن التقييم الكسول لا يزال هو الأفضل.

أفضل طريقة معروفة لتحسين أداء برنامج tarai هي استخدام دالة مساعدة متبادلة التكرار كما يلي.

def laziest_tarai ( x : int , y : int , zx : int , zy : int , zz : int ) -> int : إذا لم يكن y < x : إرجاع y else : إرجاع laziest_tarai ( tarai ( x - 1 , y , z ), tarai ( y - 1 , z , x ), tarai ( zx , zy , zz ) - 1 ، س ، ص )def tarai ( x : int , y : int , z : int ) -> int : إذا لم يكن y < x : إرجاع y else : إرجاع laziest_tarai ( tarai ( x - 1 , y , z ), tarai ( y - 1 , z , x ), z - 1 , x , y )

إليك تطبيق فعال للدالة tarai() في لغة C:

int tarai ( int x , int y , int z ) { بينما ( x > y ) { int oldx = x , oldy = y ; x = تاراي ( x - 1 , y , z ); y = تاراي ( y - 1 , z , oldx ); إذا ( س <= ص ) استراحة ؛ z = تاراي ( z - 1 , oldx , oldy ); } عودة ص ; }

لاحظ الفحص الإضافي لـ ( x <= y) قبل تقييم z (الوسيط الثالث)، مما يتجنب التقييم التكراري غير الضروري.

مراجع

  1. بيتر كوفي (1996). "اختبار تاك يصمد أمام اختبار الزمن". أسبوع الحاسوب الشخصي . 13 (39).
  2. "الأساليب التكرارية" بقلم إليوت راستي هارولد
  3. جونسون-ديفيز، ديفيد (يونيو 1986). "ستة من أفضل سباقات ضد الساعة" . مستخدم أكورن . الصفحات 179، 181-182 . تم الاطلاع عليه بتاريخ 28 أكتوبر 2020 . 
  4. جونسون-ديفيز، ديفيد (نوفمبر 1986). "اختبار تاك" . مستخدم أكورن . ص 197، 199. تم الاسترجاع في 28 أكتوبر 2020 . 
  5. جون مكارثي (ديسمبر 1979). "دالة مثيرة للاهتمام في لغة ليسب". نشرة ACM ليسب (3): 6-8 . doi : 10.1145/1411829.1411833 . S2CID 31639459 .