আমি জানি এটি একটি সহজ পদ্ধতির নাও হতে পারে তবে আমি কার্যকরী ভাষা থেকে "ফিক্স" নামক একটি কৌশল সম্পর্কে শিখেছি । fixHaskell, থেকে ফাংশন হিসাবে আরো সাধারণভাবে পরিচিত হয় ওয়াই combinator , যা সবচেয়ে সুপরিচিত এক নির্দিষ্ট বিন্দু combinators ।
একটি নির্দিষ্ট বিন্দু এমন একটি মান যা কোনও ফাংশন দ্বারা অপরিবর্তিত থাকে: ফাংশন এফের একটি নির্দিষ্ট বিন্দু এমন কোনও এক্স যেমন x = f (x)। একটি স্থির বিন্দু সংমিশ্রণ y একটি ফাংশন যা কোনও ফাংশনের জন্য একটি নির্দিষ্ট পয়েন্ট ফেরত দেয়। যেহেতু y (f) f এর একটি নির্দিষ্ট বিন্দু, তাই আমাদের y (f) = f (y (f)) থাকে।
মূলত, ওয়াই কম্বিনেটর একটি নতুন ফাংশন তৈরি করে যা মূলগুলির সমস্ত আর্গুমেন্ট গ্রহণ করে, এবং অতিরিক্ত যুক্তি যা পুনরাবৃত্তির কাজ করে। এটি কীভাবে তীক্ষ্ণ স্বরলিপি ব্যবহার করে আরও সুস্পষ্ট। পরিবর্তে বন্ধনীর মধ্যে আর্গুমেন্ট লেখার ( f(x,y,...)), তাদের ফাংশন পর লিখুন: f x y ...। ওয়াই সংযুক্তকারী হিসাবে সংজ্ঞায়িত করা হয় Y f = f (Y f); বা, পুনরাবৃত্তি ফাংশন জন্য একক যুক্তি সহ Y f x = f (Y f) x,।
যেহেতু পিএইচপি স্বয়ংক্রিয়ভাবে কার্যগুলি কারি করে না , fixকাজ করার জন্য এটি কিছুটা হ্যাক , তবে আমি মনে করি এটি আকর্ষণীয়।
function fix( $func )
{
return function() use ( $func )
{
$args = func_get_args();
array_unshift( $args, fix($func) );
return call_user_func_array( $func, $args );
};
}
$factorial = function( $func, $n ) {
if ( $n == 1 ) return 1;
return $func( $n - 1 ) * $n;
};
$factorial = fix( $factorial );
print $factorial( 5 );
নোট করুন এটি অন্যদের পোস্ট করা সহজ বন্ধের সমাধানগুলির মতো প্রায় একই, তবে ফাংশনটি fixআপনার জন্য বন্ধকে তৈরি করে। ফিক্সড পয়েন্ট কম্বিনেটরগুলি ক্লোজার ব্যবহারের চেয়ে কিছুটা জটিল, তবে আরও সাধারণ এবং এর অন্যান্য ব্যবহারও রয়েছে। যদিও ক্লোজার পদ্ধতিটি পিএইচপি (যা ভয়ঙ্করভাবে কার্যকরী ভাষা নয়) এর জন্য আরও উপযুক্ত, তবে মূল সমস্যাটি উত্পাদন ব্যায়ামের চেয়ে বেশি অনুশীলনের, তাই ওয়াই সংযুক্তকারীটি একটি কার্যকর পন্থা।
global $factorial?