கணினி அறிவியல் - Pure செயற்கூறுகள் | 12th Computer Science : Chapter 1 : Problem Solving Techniques : Function
Pure செயற்கூறுகள்
ஒரே மாதிரியான அளபுருக்களை அனுப்பும் போது, சரியான விடையைத்
தரும் செயற்கூறு pure செயற்கூறுகள் ஆகும். எடுத்துக்காட்டாக, கணித செயற்கூறு
sin(0)-ன் விடை எப்பொழுதுமே 0 ஆகும். இதன் அர்த்தம் என்னவென்றால், அதே அளபுருக்களைக்
கொண்டு செயற்கூறினை ஒவ்வொரு முறையும் அழைக்கும் போது, அதே சரியான விடையை எப்பொழுதும்
பெறலாம். மாறியின் பண்பை மாற்றக் கூடிய எந்த விதமான வெளிப்புற மாறியும் இல்லாமல் இருந்தால்
அந்த செயற்கூறு pure செயற்கூறாகும்.
ஒரு எடுத்துக்காட்டை காண்க
let square x
return: x * x
மேலேயுள்ள square செயற்கூறு pure செயற்கூறு ஆகும். ஏனென்றால்
ஒரே மாதிரியான உள்ளீட்டிற்கு வேறுவித்தியாசமான வெளியீட்டைத் தராது.
கோட்பாடு சார்ந்த நன்மைகளை pure செயற்கூறுகள் கொண்டுள்ளன. இதன்
ஒரு நன்மை என்னவென்றால், pure செயற்கூறாக இருக்கும் பொழுது, அதே அளபுருக்களுடன் செயற்கூறுவை
பல தடவைகள் அழைக்கும்போது, உண்மையில் பெயர்ப்பிக்கு செயற்கூறுவை மீண்டும் ஒரு தடவை
அழைக்கும் தேவை மட்டுமே ஏற்படுகிறது.
let i: = 0;
if i < strlen (s) then
-- Do something which doesn't affect s
++i
இது இயக்கப்படும் போது, ஒவ்வொரு முறையும் strlen (s) அழைக்கப்படுகிறது.
strlen க்கு ஒட்டு மொத்தமாக ‘s’ தற்சுழற்ச்சி செய்ய தேவைப்படுகிறது. strlen என்பது
pure செயற்கூறு என்றும், ‘s’ யை மடக்கினுள் புதுப்பிக்காமலும் இருந்தால் , strlen க்கு
தேவைக்கு அதிகமான அழைப்பை நீக்கிவிட்டு, மடக்கை ஒரே ஒரு முறை செயல்படுத்தும். இதிலிருந்து
நாம் தெரிந்து கொள்வது யாதெனில், strlen என்பது pure செயற்கூறாகும். ஏனென்றால், செயற்கூறு
அளபுருவாக ஒரே ஒரு மாறியை எடுத்துக் கொண்டு அதனுடைய நீளத்தை கணக்கிடுகிறது. இந்த செயற்கூறு
வெளி நினைவகத்தில் இருந்து உள்ளீட்டை எடுத்துக் கொள்கிறது. ஆனால் மதிப்புகளை மாற்றுவதில்லை
திருப்பி அனுப்பும் மதிப்புக்கள் வெளி நினைவகத்தில் இருந்து பெறப்பட்டதாகும்.
குறிப்பு
pure
செயற்கூற்றை மதிப்பீடு செய்யும் போது, எந்தவொரு பக்கவிளைவும் ஏற்படாது.
செயற்கூறுக்கு அளபுருக்களை அனுப்பாதபோதும், செயற்கூறின் உள்ளே
உள்ள மாறியானது பக்க விளைவுகளை ஏற்படுத்தும். இந்த வகையான செயற்கூறைimpure செயற்கூறு என்பர்.
ஒரு செயற்கூறு அந்த வரையறை தொகுதியின் வெளியே உள்ள மாறிகள் அல்லது செயற்கூறுகளைச் சார்ந்து
இருந்து ஒவ்வொரு முறை அழைக்கும் பொழுதும் செயற்கூறு ஒரே மாதிரியாக இயக்கப்படும் என
கூற இயலாது. எடுத்துக்காட்டாக, random( ) என்கிற கணித செயற்கூறு ஒரேமாதிரியான அழைப்புக்கூற்றுக்கு
வெவ்வேறுவிதமான வெளியீடுகளைக் கொடுக்கும்.
let Random number
let a := random()
if a > 10 then
return: a
else
return: 10
இங்கு, Random என்பது impure செயற்கூறு ஆகும். ஏனெனில் இதனை
அழைக்கும் பொழுது என்ன விடை கிடைக்கும் என் நிச்சயமாக கூற இயலாது.
செயற்கூறு கவனிக்கத்தக்க வெளியுலக தொடர்பில் இருக்கும் போது
பக்க விளைவுகள் ஏற்படும் என்பதை அறிவீர்கள். நம்முடைய நோக்கம் Pure செயற்கூறுவை உருவாக்குவதாக
இருப்பினும் அது சில சமயங்களில் impure செயற்கூறுவாக மாறி விடுகிறது. பக்க விளைவு என்பது
கேடு விளைவிக்கும் செயல் அல்ல, என்பதை நினைவில் கொள்க. சில சமயங்களில் அவை பயனுள்ளதாகும்.
செயற்கூறுவின் வெளியே மாறியை மாற்றம் செய்வது என்பது பக்கவிளைவுகளில்
ஒன்றாகும்.
எடுத்துக்காட்டு
let y: = 0
(int) inc (int) x
y: = y + x;
return (y)
மேலே கூறப்பட்ட எடுத்துக்காட்டில், y-ன் மதிப்பு செயற்கூறு வரையறையின்
உள்ளே மாறுவதால் விடையானது ஒவ்வொரு முறையும் மாறும். inc() செயற்கூறுவின் பக்க விளைவு
என்னவென்றால் வெளிப்புற மாறியான y' ன் மதிப்பை மாற்றுவதாகும். சில பக்க விளைவுகளை அடையாளம்
காண்பது எளிதானதாகும் மற்றும் சில யோசிக்க தககுந்ததாக இருக்கும். நமது Impure செயற்கூறு
எந்த அளபுருக்களையும் எடுத்துக் கொள்ளாது, எந்த மதிப்பையும் திருப்பி அனுப்பாது என்பது
ஒரு நல்ல அறிகுறியாகும்.
கொடுக்கப்பட்ட அனைத்து எடுத்துக்காட்டுகள் மற்றும் விளக்கங்களில்
இருந்து நாம் pure மற்றும் impure செயற்கூறுகளின் வேறுபாட்டை பின்வருமாறு காணலாம்.
இரண்டு நேர்ம முழு எண்களின் மீப்பெரு வகுஎண்ணை கண்டுபிடிக்கும்
pure செயற்கூறினை எடுத்துக்காட்டாக காணலாம்.
let rec gcd a b:=
ifb< > 0 then gcd b (a mod b) else return a;
வெளியீடு
gcd 13 27;
-: int = 1
gcd 20536 7826;
- : int = 2
மேலே கொடுக்கப்பட்டுள்ள 'gcd' என்பது செயற்கூறுவின் பெயர் ஆகும். மாறி ‘b' ன் மதிப்பு 0 ஆகும் வரை செயற்கூறு தன்னைத் தானே அழைத்துக் கொள்ளும் b மற்றும் (a mod b) ஆகிய இரண்டு அளபுருக்களை gcd செயற்கூறுவினுள் ‘a’ மற்றும் ‘b' க்கு அனுப்புவதை நினைவில் கொள்க.
பதினொன்றாம் வகுப்பில் படித்த குரோமிலெண்டில் பச்சோந்திகள் என்ற
பகுதியை நினைவில் கூர்க. இரண்டு வகையான பச்சோந்திகள் சமமான எண்ணாக இருந்தால், இந்த
இரண்டு வகையும் சேர்ந்து மூன்றாவது வகையின் நிறத்தை மாற்றுவதற்கான நிரல் நெறிமுறையை
உருவாக்கவும். முடிவில் அனைத்தும் ஒரே நிறத்தை காண்பிக்க வேண்டும். ஒவ்வொரு வகை பச்சோந்தியின்
எண்ணிக்கையையும் a,b,c மாறிகளாக எடுத்துக் கொள்வோம். அதனுடைய தொடக்க மதிப்பு முறையே
A, B மற்றும் C. a = b என்பது உள்ளீட்டு பண்பு ஆகும். இதன் உள்ளீட்டு வெளியீட்டுக்கான
தொடர்பு a = b = 0 மற்றும் C = A+B+C ஆகும். இதனுடைய நிரல் நெறிமுறைக்கு
monochromatize எனப் பெயரிடலாம். இதை monochromatize (a , b , c) என குறிப்பிடலாம்.
ஒவ்வொரு சுழற்சி நிலையிலும் 2 வகையான ஒரே எண்ணைக் கொண்ட பச்சோந்திகள்
சந்தித்து மூன்றாவது வகைக்கு அதன் வண்ணத்தை மாற்றும். எடுத்துக்காட்டாக, A, B, C =
4, 4, 6, எனில் சந்திப்பின் வரிசையானது பின்வருமாறு,
ஒவ்வொரு சந்திப்பிலும், a மற்றும் b-ன் மதிப்பு ஒன்று குறைகிறது
மற்றும் c-ன் மதிப்பு 2அதிகரிக்கிறது. இதற்கான தீர்வு சுழற்சி நெறிமுறையில் வெளிப்படுத்துகிறது.
monochromatize (a, b, c)
while a > 0
a, b, c := a -1, b-1, c+2
இந்த நெறிமுறை பாய்வுப்படமாக கீழே காண்பிக்கப்பட்டுள்ளது.
இப்பொழுது நிரல் நெறிமுறையை செயற்கூறுவைப் பயன்படுத்தி எழுதலாம்.
let rec monochromatize a b c:=
if a > 0 then
a, b, c := a-1, b-1, c+2
else
a:=0, b:=0, c:= a + b + c
return c