Рекурсив методлар
Ўзини ўзи чақирадиган методларни рекурсив деб аталади. Бундай рекурсия тўғри рекурсия дейилади. Ёндош рекурсияда икки ёки ундан ортиқ методлар бир-бирини чақиради. Агар метод ўзини ўзи чақирса, стекда унинг параметрлари қийматларининг нусхалари яратилади. Сўнгра бошқарув методнинг биринчи бажариладиган операторига узатилади. Такрорий чақиришда бу жараён такрорланади.
Ҳар бир рекурсив методда ҳисоблаш жараёнини тугатиш учун ҳеч бўлмаганда битта норекурсив тармоққа эга бўлиши зарур. Метод ўз ишини тугатганидан кейин банд қилинган стеклар бўшатилади ва бошқарув чақирувчи методга узатилади.
Рекурсив функцияга яққол мисол қилиб факториални ҳисоблаш функциясини олиш мумкин. Маълумки,
long fact( long n ) {
if ( n == 0 || n == 1 ) return 1; // норекурсив тармоқ
return ( n * fact( n – 1 ) ); // рекурсив тармоқ
}
Худди шу амални қисқароқ ҳам ёзиш мумкин:
long fact( long n ) {
return ( n > 1 ) ? n * fact( n – 1 ) : 1;
}
Кўпинча рекурсив методлардан рекурсив алгоритмларни компакт формада ёзиш мақсадида фойдаланилади. Рекурсиянинг камчилиги методни такрорий чақириш ва маълумотларни узатиш учун кўп вақт хамда хотирадан катта ҳажм талаб қилиши билан боғлиқ.
Ўзгарувчан сондаги параметрли методлар
Айрим холларда турли сондаги аргументларни узатиш билан боғлиқ методларни яратишга тўғри келади. C# дастурлаш тилида бу амални params хизматчи сўзи ёрдамида ташкил қилиш мумкин. бу хизматчи сўздан кейин кўрсатилган параметр параметрлар рўйхатининг сўнгида ёзилади ва номаълум узунликдаги массив деган маъносни англатади. Масалан:
public int Calculate( int a, out int c, params int[] d ) …
Бу методга уч ва ундан ортиқ параметрларни узатиш мумкин. Метод ичида учинчи параметрдан бошлаб қолган параметрларга оддий массив элементлари сифатида қаралади. Элементлар миқдорини массив унинг Length ҳусусиятидан олади. Намуна сифатида массивнинг ўрта арифметик қийматини ҳисоблашни кўрайлик (14.1-листинг).
using System;
namespace ConsoleApplication1
{ class Class1
{
public static double Average( params int[] a )
{
if ( a.Length == 0 )
throw new Exception( "Методнинг аргументлари етарли эмас " );
double av = 0;
foreach ( int elem in a ) av += elem;
return av / a.Length;
}
static void Main()
{ try
{
int[] a = { 10, 20, 30 };
Console.WriteLine( Average( a ) ); // 1
int[] b = { -11, -4, 12, 14, 32, -1, 28 };
Console.WriteLine( Average( b ) ); // 2
short z = 1, e = 12;
byte v = 100;
Console.WriteLine( Average( z, e, v ) ); // 3
Console.WriteLine( Average() ); // 4
}
catch( Exception e )
{
Console.WriteLine( e.Message );
return;
}
}
}
}
19.1-листинг. ЎЗгарувчан миқдордаги параметрли метод
Дастурнинг натижаси қуйидагича:
10
20
40
Методнинг аргументлари етарли эмас
Параметр-массив фақат битта бўлади ва рўйхатнинг охирида кўрсатилади. Унга мос аргументлар типларини ошкормас кўринишда массивнинг типига ўтказилиши мумкин бўлиши
Do'stlaringiz bilan baham: |