Сравнителна таблица
Основа за сравнение | рекурсия | Повторение |
---|---|---|
Основен | Операторът в тялото на функцията извиква самата функция. | Позволява многократно да се изпълнява набор от инструкции. |
формат | В рекурсивна функция се посочва само условие за прекратяване. | Итерацията включва инициализация, състояние, изпълнение на оператор в рамките на цикъл и актуализация (увеличения и понижения) на управляващата променлива. |
Прекратяване на договора | Условно израза е включена в тялото на функцията, за да принуди функцията да се върне, без да се изпълнява рекурсивно повикване. | Операторът за повторение се изпълнява многократно, докато се достигне определено условие. |
състояние | Ако функцията не съвпадне с някое условие, наречено (основен случай), то води до безкрайна рекурсия. | Ако условието за контрол в итерационното изявление никога не стане фалшиво, то води до безкрайна итерация. |
Безкрайно повторение | Безкрайната рекурсия може да разбие системата. | Безкрайният цикъл многократно използва цикъла на процесора. |
приложен | Рекурсията винаги се прилага към функциите. | Итерацията се прилага към итерационни изявления или "цикли". |
купчина | Стекът се използва за съхраняване на набора от нови локални променливи и параметри всеки път, когато се извиква функцията. | Не използва стека. |
Отгоре | Рекурсията притежава натоварване от повтарящи се повиквания на функции. | Няма над главата на повтарящо се функционално повикване. |
скорост | Бавно в изпълнение. | Бързо в изпълнение. |
Размер на кода | Рекурсията намалява размера на кода. | Итерацията прави кода по-дълъг. |
Дефиниция на рекурсия
C ++ позволява на функцията да се извиква в своя код. Това означава, че дефиницията на функцията притежава функционално извикване към себе си. Понякога се нарича още „ кръгова дефиниция “. Наборът от локални променливи и параметри, използвани от функцията, са новосъздадени всеки път, когато функцията се извиква и се съхранява в горната част на стека. Но всеки път, когато дадена функция се извиква, тя не създава ново копие на тази функция. Рекурсивната функция не намалява значително размера на кода и дори не подобрява използването на паметта, но прави някои в сравнение с итерацията.
За да прекратите рекурсията, трябва да включите оператор select в дефиницията на функцията, за да принудите функцията да се върне, без да дава рекурсивно повикване към себе си. Липсата на оператор select в дефиницията на рекурсивна функция ще позволи на функцията да се обади в безкрайна рекурсия.
Нека разберем рекурсия с функция, която ще върне факториалът на числото.
int factorial (int num) {int отговор; if (num == 1) {return 1; } else {answer = факториал (num-1) * num; // recursive calling} return (отговор); }
В горния код, операторът in else показва рекурсията, тъй като операторът извиква функционалната функция (), в която се намира.
Определение на итерация
Итерацията е процес на изпълнение на набора от инструкции многократно, докато условието в итерационното изявление стане фалшиво. Изразът за итерация включва инициализацията, сравнението, изпълнението на операторите в итерационното изявление и накрая актуализирането на контролната променлива. След като контролната променлива се актуализира, тя отново се сравнява и процесът се повтаря, докато условието в итерационното изявление се окаже невярно. Итерационните отчети са "за" цикъл, "while" цикъл, "do-while" цикъл.
Операторът за итерация не използва стека за съхранение на променливите. Следователно, изпълнението на операцията за итерация е по-бързо в сравнение с рекурсивната функция. Дори функцията за итерация не разполага с натоварване на повтарящо се функционално извикване, което също прави неговото изпълнение по-бързо от рекурсивната функция. Итерацията се прекратява, когато условието за управление стане невярно. Липсата на условие за контрол в оператора за итерация може да доведе до безкраен цикъл или може да доведе до грешка при компилирането.
Нека да разберем итерацията по отношение на горния пример.
int factorial (int num) {int answer = 1; // се нуждае от инициализация, защото може да съдържа стойност за боклук преди инициализацията й за (int t = 1; t> num; t ++) // итерация {answer = answer * (t); връщане (отговор); }}
В горния код функцията връща факториал на числото, използвайки операция за итерация.
Основни разлики между рекурсия и повторение
- Рекурсията е, когато метод в програма многократно се нарича себе си, докато итерацията е, когато набор от инструкции в програмата се изпълняват многократно.
- Рекурсивният метод съдържа набор от инструкции, самото извикване на изявление и условие за прекратяване, докато итерационните изявления съдържат инициализация, прираст, условие, набор от инструкции в рамките на линия и контролна променлива.
- Условното изявление решава прекратяването на стойността на рекурсията и управляващата променлива да реши прекъсването на операцията за итерация.
- Ако методът не доведе до състояние на прекратяване, то той влиза в безкрайна рекурсия. От друга страна, ако управляващата променлива никога не води до стойността на прекратяването, изявлението за итерация се изпълнява безкрайно.
- Безкрайната рекурсия може да доведе до срив на системата, докато безкрайната итерация консумира процесорни цикли.
- Рекурсията винаги се прилага към метода, докато итерацията се прилага за набор от инструкции.
- Променливите, създадени по време на рекурсия, се съхраняват на стека, докато итерацията не изисква стек.
- Рекурсията причинява натоварване на повтарящо се функционално извикване, докато итерацията няма функция, призоваваща служебни данни.
- Поради функцията извикване на режима, изпълнението на рекурсия е по-бавно, докато изпълнението на итерацията е по-бързо.
- Рекурсията намалява размера на кода, докато итерациите правят кода по-дълъг.
Заключение:
Рекурсивната функция е лесна за писане, но те не се представят добре в сравнение с итерацията, докато итерацията е трудна за писане, но представянето им е добро в сравнение с рекурсията.