Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Long fact ( long n )




Рекурсия и рекурсивные алгоритмы

Обмен данными между функциями

If (prostoe(a))

printf("Da!");

else printf("Net!");

getch();

}

int prostoe (long int a) // реализация функции

{ if (a<=1) return 0;

for (long int i=2;i<=a/2; i++)

if (a%i==0) return 0;

return 1;

}

Функции могут обмениваться данными тремя способами:

1. Используя глобальные переменные.

2. Передавая копии данных.

3. Передавая адреса, по которым записаны данные.

В первом случае глобальные переменные объявляются вне функций и становятся известными во всех нижележащих функциях.

Если же внутри функций будут объявлены локальные переменные с таким же именем, что и глобальные, то приоритет отдается локальным.

Использование глобальных переменных внутри функций не рекомендуется. Следует все данные передавать, используя список параметров.

Локальные переменные видимы только внутри функций. Если имя глобальной и локальной переменной совпадают, то приоритет отдается локальной переменной. Память для них выделяется в стеке и после выхода из функции эта часть памяти освобождается. Параметры, заданные во входном списке функции, также являются локальными переменными. Функция может возвращать только одно значение, определяемое оператором return. Для получения доступа к другим переменным, используются переменные типа указатель.

Для того, чтобы из функции можно было возвратить несколько значений, используются указатели (функция меняет местами значения переменных A и B):

void Swap (int &A; int &B) {int C=A; A=B; B=C;};

 

Рекурсия – это способ организации процесса вычислений, при котором функция в ходе выполнения программы обращается сама к себе, прямо или косвенно.

Рекурсия – мощный инструмент разработки программ, позволяющий чрезвычайно компактными средствами определить большие объемы вычислений.

С помощью рекурсии определяются многие понятия. Например, понятие натурального числа можно определить так:

a) 1 есть натуральное число;

b) число, следующее за натуральным, также есть натуральное число.

Известно, что факториал числа n равен произведению всех натуральных чисел от 1 до n.

Таким же образом можно определить функцию факториал:

В этом примере функция определяется через саму себя, т.е. рекурсивно.

a) 0! = 1;

b) n! = (n-1)! * n.

Приведем реализацию функции:

{ if (n==0) return 1;

return n*fact(n-1);

}

Следует отметить, что рекурсию наиболее выгодно использовать для объектов, определяемых рекурсивно: факториал, натуральное число, двоичный код, дерево, список и т.д. Поскольку глубина рекурсивных вызовов всегда должна быть конечна, в теле рекурсивной функции обязательно должно быть условие окончания этого процесса.

Кроме того возможно создание косвенных рекурсивных процессов, когда функция А вызывает функцию В, а та, в свою очередь, вызывает функцию А.

       
   
 

 


       
   
 
 


Рассмотрим более подробно процессы, происходящие в стеке локальных переменных, при вызове рекурсивных функций.

Известно, что при вызове функции в стеке создаются локальные переменные, связанные со списком передаваемых параметров и с именем функции.

 

     
 

fact   Уровень 3*fact(2)
  n    
 

fact   Уровень 2*fact(1)
  n    
 

fact   Уровень 1*fact(0)
  n    
fact   Уровень
 

  n    
рекурсивный подъем
рекурсивный спуск

 

При прямом ходе процесса подготавливаются локальные переменные, а вычисления проводятся при обратном возврате. Прямой ход называется рекурсивным спуском, а обратный ход – рекурсивным подъемом. Количество вызовов функции в данном процессе называется глубиной рекурсии.

В качестве примера приведем еще две рекурсивные функции:

// -------------------------------------------------

// Функция kcc возвращает колич.цифр числа n.

int kcc(long n)

{if (n<10) return 1; return kcc(n/10)+1;}

// -------------------------------------------------

// Функция scc возвращает сумму цифр числа n.

int scc(long n)

{if (n<10) return 1; return scc(n/10)+n%10;}




Поделиться с друзьями:


Дата добавления: 2014-11-29; Просмотров: 430; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.