ගැටලුවක් කුඩා කැබලිවලට අතු බෙදී යන ලෙස පෙනෙන නිමක් නැති චක්රයක ඔබ කවදා හෝ හසු වී තිබේද?
එසේ නම්, ඔබ ප්රත්යාවර්තනයේ සිත් ඇදගන්නාසුළු ලෝකයට පැමිණ ඇත. එය තේරුම් ගැනීම අභියෝගාත්මක බවක් පෙනෙන්නට තිබුණත්, කරදර නොවන්න! මෙම ලිපියෙන්, අපි පුනරාවර්තන වර්ග ගැන ඉගෙන ගැනීමට රසවත් ගමනක් යන්නෙමු.
එබැවින් අපි බොහෝ පුනරාවර්තන ප්රවේශයන් ගවේෂණය කරන විට බකල් කරන්න. ආකර්ශනීය පුනරාවර්තන ක්ෂේත්රයට ඇතුළු වීමට සූදානම් වන්න සහ සංකීර්ණ ගැටළු විසඳීමේ එහි විශිෂ්ට හැකියාව නිරීක්ෂණය කරන්න.
Recursions යනු හරියටම කුමක්ද?
මූලික වචන වලින් කිවහොත්, පුනරාවර්තනය යනු ක්රියාත්මක කිරීමේදී තමාටම කැඳවන ශ්රිතයක් ඇතුළත් ප්රබල ක්රමලේඛන තාක්ෂණයකි. එය හරියට කැඩපතක් දෙස බලා සිටීම හා රූපයක් ඇතුළත රූපයක් දැකීම වැනි ස්වයං-යොමු චක්රයක් ඇති වේ.
අපට විශාල ගැටලු කුඩා, වඩාත් කළමනාකරණය කළ හැකි උප ගැටලුවලට බෙදීමෙන් පුනරාවර්තනය භාවිතයෙන් ඒවාට මුහුණ දිය හැක.
එය ජිග්සෝ එකක් එකට තැබීමට සමානයි, එහිදී එක් කැබැල්ලක් අනෙකුත් කොටස් වලට සම්බන්ධ වී සම්පූර්ණ පින්තූරයක් ලබා දෙයි. ප්රත්යාවර්තනය මඟින් විවිධ යෙදවුම් සමඟ එකම උපදෙස් මාලාව පුනරුච්චාරණය කිරීමෙන් අලංකාර සහ කාර්යක්ෂම ආකාරයකින් ගැටළු විසඳීමට අපට ඉඩ සලසයි.
1-සෘජු පුනරාවර්තනය
සෘජු ප්රත්යාවර්තනය යනු ශ්රිතයක් සෘජුවම හඳුන්වනු ලබන වඩාත් මූලික පුනරාවර්තන වර්ගයයි. එය අවසන් කිරීමට තුඩු දෙන මූලික නඩුවක් සාක්ෂාත් කර ගන්නා තෙක් ගැටළුකාරී ගැටලුවක් කුඩා උප ගැටළු වලට බෙදීම ඇතුළත් වේ.
ප්රත්යාවර්තී ශ්රිතය විවිධ ආදාන සමඟින් කැඳවයි, එම උපදෙස් මාලාවම නැවත නැවත ක්රියාත්මක කිරීම සක්රීය කරයි. සෑම ආයාචනයක්ම පෙර එක මත ගොඩනැගෙයි, ප්රත්යාවර්තනය අවසන් වීමට හේතු වන මූලික අවස්ථාවට ක්රමානුකූලව ආසන්න වේ.
අපි මෙම උදාහරණය පරීක්ෂා කර බලමු.
def countdown(n):
if n <= 0:
return
print(n)
countdown(n - 1)
countdown(5)
ප්රතිදාන:
5
4
3
2
1
2-වක්ර ප්රතිවර්තනය
වක්ර පුනරාවර්තනය පුනරාවර්තන මාර්ගයට කුතුහලය දනවන පෙරළියක් එක් කරයි. සෘජු පුනරාවර්තනයට ප්රතිවිරුද්ධව, ශ්රිතයක් පැහැදිලිවම ඇමතීම ඇතුළත් වේ, වක්ර පුනරාවර්තනයට ශ්රිත ඇමතුම් දාමයක් ඇතුළත් වේ.
එක් ශ්රිතයක් තවත් ශ්රිතයක් අමතයි, එය පසුව මුල් ශ්රිතය හෝ අවසානයේ මුල් පිටපත වෙත යන වෙනත් ඕනෑම ශ්රිතයක් ලෙස හැඳින්විය හැක. මෙම අන්තර් සම්බන්ධිත ශ්රිත ඇමතුම් ජාලය ගැටලුවක් විසඳීමට කාර්යයන් කිහිපයක් සහයෝගීව ක්රියා කරන සිත් ඇදගන්නා නර්තනයක් නිපදවයි.
උදාහරණයක්:
def function_A(n):
if n > 0:
print("A:", n)
function_B(n - 1)
def function_B(n):
if n > 0:
print("B:", n)
function_A(n - 1)
function_A(3)
ප්රතිදාන:
A: 3
B: 2
A: 1
3-රේඛීය පුනරාවර්තනය
ඔබ ඔබේ පරමාර්ථය කරා ළඟා වන තෙක්, වරකට එක පියවරක්, සෘජු මාර්ගයක ගමනක් සලකා බලන්න. මෙම අනුක්රමික තාක්ෂණය මූර්තිමත් වන්නේ රේඛීය පුනරාවර්තනය මගින් වන අතර, එක් එක් ශ්රිත පුනරාවර්තනයකදී ශ්රිතයක් තනි පුනරාවර්තන ඇමතුමක් සිදු කරයි.
සෑම ප්රත්යාවර්තක ඇමතුමක් සමඟම, ප්රත්යාවර්තී ක්රියාවලිය නිකුතු ප්රමාණය අඩු කිරීමෙන් මූලික නඩුවකට සමීප වේ. එය පැහැදිලි සහ රේඛීය ආකාරයකින් ඉදිරියට යන අතර, අවසාන පිළිතුර ලැබෙන තෙක් උප ගැටළු එකින් එක විසඳා ගනී.
උදාහරණයක්:
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
result = factorial(5)
print(result)
ප්රතිදාන:
120
4-ගස් පුනරාවර්තනය
ශ්රිතයක් පුනරාවර්තන ඇමතුම් කිහිපයකට බෙදෙන විට, අපි ගස් පුනරාවර්තන ලෝකයට ඇතුළු වෙමු. ගස් පුනරාවර්තනයේ ශ්රිතයක් බොහෝ පුනරාවර්තන ඇමතුම් ජනනය කරයි, ඒ සෑම එකක්ම ගසක අතු කරන ආකාරයටම වෙනම උප ගැටලුවක් විසඳයි.
මෙම ශාඛා ව්යුහය මඟින් මාර්ග කිහිපයක් එකවර විමර්ශනය කිරීමට ඉඩ සලසයි, සංකීර්ණ ගැටළු කුඩා, අන්තර් සම්බන්ධිත සංරචක වලට ඵලදායී ලෙස බිඳ දමයි.
උදාහරණයක්:
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(6)
print(result)
ප්රතිදාන:
8
5-Nested Recursion
නෙස්ටඩ් පුනරාවර්තනය පුනරාවර්තන විශ්වයට උද්වේගකර සංකීර්ණත්වයක් එක් කරයි. මෙම ආකාරයේ පුනරාවර්තනයේ දී, ශ්රිතයක් තවත් පුනරාවර්තන ඇමතුමක් තුළ තර්කයක් ලෙස පුනරාවර්තන ඇමතුමක් ඇතුළත් කරයි.
අභ්යන්තර පුනරාවර්තන ඇමතුම බාහිර පුනරාවර්තන ඇමතුම මත රඳා පවතින අගයක් මත ක්රියා කරයි. සෑම කැදලි ආමන්ත්රණයක් සමඟම සංකීර්ණත්වය වර්ධනය වන අතර, කැදලි පුනරාවර්තන ඇමතුම්වල කුතුහලය දනවන රටාවකින් අවසන් වේ.
උදාහරණයක්:
def nested_recursion(n):
if n > 100:
return n - 10
return nested_recursion(nested_recursion(n + 11))
result = nested_recursion(95)
print(result)
ප්රතිඵලය:
91
6-වලිගය පුනරාවර්තනය
වලිගය පුනරාවර්තනය යනු ඒවායේ ක්රියාකාරිත්වය වැඩිදියුණු කළ හැකි පුනරාවර්තන ඇල්ගොරිතම සඳහා ප්රශස්තිකරණ තාක්ෂණයකි. ප්රත්යාවර්තී ඇමතුම ටේල් පුනරාවර්තනය, සෑදීම සමඟ ශ්රිතයක අවසාන ක්රියාව ලෙස දිස්වේ.
පුනරාවර්තන ඇමතුමෙන් පසු කැපී පෙනෙන මෙහෙයුම් කිසිවක් නොමැති නිසා, සම්පාදකයාට හෝ පරිවර්තකයාට එය සරල පැනීමකින් ප්රතිස්ථාපනය කිරීමෙන් ප්රත්යාවර්තනය සරල කළ හැක.
මෙම ප්රශස්තිකරණ ප්රවේශය, tail call optimization ලෙස හැඳින්වේ, එක් එක් ප්රත්යාවර්තී ඇමතුම සඳහා අට්ටි රාමුවක් රඳවා ගැනීමේ අවශ්යතාවය අඩු කරයි, ප්රතිඵලයක් ලෙස වැඩි වේගයක් සහ අඩු මතක භාවිතයක් ඇති වේ.
උදාහරණයක්:
def tail_factorial(n, result=1):
if n == 0:
return result
return tail_factorial(n - 1, result * n)
result = tail_factorial(5)
print(result)
පිටතට:
120
7-වලිගය නොවන පුනරාවර්තනය
වලිගය පුනරාවර්තනයට ප්රතිවිරුද්ධව, ටේල් නොවන පුනරාවර්තනයට ශ්රිතයක් තුළ පුනරාවර්තන ඇමතුමෙන් පසුව සිදු කෙරෙන අමතර ක්රියාකාරකම් ඇතුළත් වේ. තවත් ක්රියාවක් සිදු කිරීමට පෙර, එක් එක් ප්රත්යාවර්තී ඇමතුම සම්පූර්ණ කර ආපසු පැමිණිය යුතුය.
එහි ප්රතිඵලයක් වශයෙන්, මූලික අවස්ථාවට ළඟා වන තෙක් සහ ප්රතිවර්තනය අවසන් වන තුරු, කැපී පෙනෙන මෙහෙයුම් තොගයක් පවත්වා ගෙන යනු ලැබේ. වලිග නොවන ප්රත්යාවර්තනය බොහෝ විට වැඩි මතකයක් භාවිතා කරන අතර වලිගය ප්රත්යාවර්තනයට වඩා අඩු කාර්යක්ෂම වේ, නමුත් එය තවමත් විවිධ ගැටළු විසඳීම සඳහා උපකාරී මෙවලමකි.
උදාහරණයක්:
def non_tail_sum(n):
if n == 0:
return 0
return n + non_tail_sum(n - 1)
result = non_tail_sum(5)
print(result)
ප්රතිදාන:
15
අවසන් කරන්න
පුනරාවර්තනය යනු වැඩසටහන්කරණයේ කුතුහලය දනවන සංකල්පයකි. එය පුනරාවර්තන, ස්වයං-යොමු ආකාරයෙන් සංකීර්ණ ගැටළු විසඳීමට අපට ඉඩ සලසයි.
එය ගැටළු ගැන සිතීමේ සහ විසඳීමේ වෙනම ක්රමයක් ඉදිරිපත් කරයි, ඒවා කුඩා, වඩාත් කළමනාකරණය කළ හැකි කොටස් වලට කැඩී යයි. කෙසේ වෙතත්, පුනරාවර්තනය සමඟ වැඩ කරන විට, සමහර කරුණු කෙරෙහි අවධානය යොමු කිරීම භාවිතා කිරීම ඉතා වැදගත් වේ.
පුනරාවර්තනය අවසන් වීමට ඉඩ සලසන සුදුසු මූලික අවස්ථා ඔබ හඳුනාගත යුතුය. ඒවා නොමැති නම්, ශ්රිතය සදාකාලිකවම තමාටම කියා ගත හැක.
දෙවනුව, පවතින තත්ත්වය මත පදනම්ව, සුදුසු ආකාරයේ පුනරාවර්තනය තෝරා ගැනීමෙන් වඩාත් කාර්යක්ෂම හා අලංකාර විසඳුම් ලබා ගත හැකිය. අතේ ඇති ගැටලුව සඳහා හොඳම දේ සොයා ගැනීමට උත්සාහ කරන්න. විශාල පුනරාවර්තන ගැඹුරක් සමඟ වැඩ කරන විට, තොග පිටාර ගැලීම වැනි විභව අන්තරායන් පිළිබඳව දැනුවත් වන්න.
ඔබමයි