КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Детали рекурсивных алгоритмов
End Else Case N of Begin Begin Begin Begin Begin Примеры рекурсивных и нерекурсивных описаний Пример 3. Функция GCD(x, y) вычисляет наибольший общий делитель (НОД) двух натуральных чисел x и y. (Алгоритм Евклида) Алгоритм Евклида, изучаемый в школьном курсе математики в средних классах, находит НОД двух чисел, вычитая из большего числа меньшее. { итеративное описание } Function GCD (x, y: Integer): Integer; While x <> y do If x < y then y:= y - x else x:= x - y; GCD:= x End; {рекурсивное описание} Function GCD (x, y: Integer): Integer; If x <> y Then If x < y then GCD:= GCD(x, y - x) else GCD:= GCD(x - y, y) Else GCD:= x End;
Рекурсивная версия следует из свойств НОД, выраженных формулами - соотношениями: x < y è НОД(x, y) = НОД(x, y - x) x > y è НОД(x, y) = НОД(x - y, y) НОД(x, x) = x; Function GCD (x, y: Integer): Integer; If (x <> 0)and(y <> 0) Then GCD:= GCD(y mod x, x mod y) else GCD:= x + y End; Пример 4. Функция Pow(x, N) возводит положительное действительное число x в натуральную степень N. (Y = xN ) { итеративный алгоритм } Function Pow(x: Real; N: Integer):Real; Var i: Integer; y: Real; y:= 1; For i:=1 to N do y:= y * x; Pow:= y End; {рекурсивный алгоритм} Function Pow(x: Real; N: Integer): Real; 0: Pow:= 1; 1: Pow:= x Pow:= Sqr(Pow(x, N div 2))*Pow(x, N mod 2) End; Итеративный алгоритм вычисления степени xN умножает y на x ровно N раз, начиная с y = 1. Для вычисления xN алгоритм выполняет N умножений. Рекурсивный алгоритм: для вычисления xN сначала предлагается вычислить x в половинной степени, а затем результат возвести в квадрат. x0 = 1; x1 = x; N четно à xN = (xN / 2)2; N нечетно à xN = (x (N-1) / 2)2 * x В этой версии алгоритм выполнит не более log2(N) возведений в квадрат и log2(N) умножений - всего 2 log2(N) действий. С помощью рекурсии удалось просто описать эффективный по времени (т.е. по количеству действий) алгоритм возведения в степень.
Алгоритмы, использующие рекурсию, обязаны содержать процедуру (функцию), вызываемую рекурсивно. Всю совокупность переменных, используемых для описания рекурсивного алгоритма, можно разделить на 3 группы: · глобальные переменные алгоритма; · параметры рекурсивной процедуры (функции); · локальные переменные этой процедуры (функции). Глобальные переменные, не являющиеся фактическими параметрами рекурсивной процедуры, сохраняют неизменными свои значения при обращениях к процедуре из основной программы или рекурсивных вызовах этой процедуры. Локальные переменные могут изменить свои значения только в данной копии рекурсивной процедуры. Значение локальной переменной, которое она имеет в момент рекурсивного вызова, не изменится и после возврата (выхода) из рекурсии. Procedure E(N:Integer); Var x:Integer;
Дата добавления: 2014-01-06; Просмотров: 357; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |