Студопедия

КАТЕГОРИИ:


Загрузка...

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

Val_type sum_rec1(val_type st_val, val_type end_val, val_type step)




Val_type sum_nonrec(val_type st_val, val_type end_val, val_type step)

Не рекурсивная подпрограмма, которая для нахождения суммы использует цикл с for

Пример 1.

If (условие)

Рекурсивный_вызов;

Блок_действий_после_рекурсивного_вызова;

}

Следует отметить, что обработку некоторой последовательности в прямом порядке необходимо производить в Блок_действий_до_рекурсивного_вызова, а в обратном порядке – в Блок_действий_после_рекурсивного_вызова.

Рекурсивная подпрограмма работает следующим образом: выполняются действия до рекурсивного вызова (Блок_действий_до_рекурсивного_вызова), после чего проверяется условие продолжения рекурсии. Если оно истинно, то происходит очередной рекурсивный вызов с использованием полученных в процессе выполнения Блок_действий_до_рекурсивного_вызова новых значений аргументов функции и снова выполняется Блок_действий_до_рекурсивного_вызова и т.д. Если же условие продолжения рекурсии становится ложным, то рекурсивный вызов функции не происходит и выполняется Блок_действий_после_рекурсивного_вызова, после чего выполнение функции завершается и происходит возврат в точку вызова (переход к выполнению следующего после вызова функции оператора). Т.к. вызов был рекурсивный то после окончания выполнения функции N-ого вызова, происходит возврат на 1-ый оператор Блок_действий_после_рекурсивного_вызова N-1-ого вызова. При этом восстанавливаются все значения аргументов функции и значения локальных переменных, которые были на N-1-ом вызове путем чтения информации из стека. Этот процесс возврата из рекурсивных вызовов происходит до тех пор, пока не произойдет возврат из первоначального вызова рекурсивной функции, причем при каждом возврате из рекурсивного вызова будут восстанавливать те значения аргументов и локальных переменных, которые имели место на момент осуществления рекурсивного вызова.

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

 

#include <stdio.h>

typedef int val_type;

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

/*

*/

{

for (val_type sum = 0; st_val <= end_val; sum += st_val, st_val += step);

return sum;

}

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

/*

Рекурсивная подпрограмма, которая осуществляет суммирование чисел в прямом порядке, т.е. от st_val до end_val. Для проверки условия останова рекурсивных вызовов используется тернарный оператор ? :.

*/

{

return st_val <= end_val ? st_val + sum_rec1(st_val + step, end_val, step) : 0;



}

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

/*

Рекурсивная подпрограмма, которая осуществляет суммирование чисел в обратном порядке, т.е. от st_val до end_val. Несмотря на ее схожесть с предыдущей рекурсивной функцией перестановка слагаемых существенно изменяет процесс суммирования. Для проверки условия останова рекурсивных вызовов используется тернарный оператор ? :.

*/





Дата добавления: 2017-01-14; Просмотров: 30; Нарушение авторских прав?;


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



ПОИСК ПО САЙТУ:





studopedia.su - Студопедия (2013 - 2017) год. Не является автором материалов, а предоставляет студентам возможность бесплатного обучения и использования! Последнее добавление ip: 54.166.153.192
Генерация страницы за: 0.015 сек.