2015-11-17 1 views
1

я наткнулся на этот код в предыдущий вопрос:Каковы преимущества рекурсии по сравнению с обычными циклами?

a = 1 

def func1(): 
    if a == 1: 
     func2() 

def func2(): 
    if a == 1: 
     func3() 

def func3(): 
    func1() 

Есть ли когда-нибудь время, когда с помощью рекурсии, как это более выгодно, чем обычный цикл? Если да, то когда это следует использовать и что такое конвенция?

+1

Это не действительно [рекурсия] (http://programmers.stackexchange.com/questions/25052/in-plain-english-what-is-recursion), и в этом вопросе нет ничего, что указывало бы любой вид «петли». Этот пример просто сопоставляет некоторые логические операторы потока управления в именованных функциях. Цель этого обычно заключается в удобочитаемости и легкости ремонтопригодности (т. Е. Путем сокращения количества строк в коде, которые необходимо пересмотреть, если логическое изменение основывается) –

+1

@DavidZemens пример является взаимно-рекурсивным, поэтому он представляет собой бесконечный цикл как есть. –

ответ

3

Есть использует для рекурсивных вызовов и лупингов:

При использовании рекурсивной:

  • довольно простые методы логического вызова
  • dépend о том, как глубоко вы идете в рекурсии вы будете иметь проблемы с памятью
  • Они сделаны для использования лучших на функциях дерева или методов

Когда вы используете зацикливание

  • чистые логики, но не просто, как рекурсивные вызовы иногда
  • Вы лучше контролировать на использовании памяти вместо рекурсивных методов или функций
  • Они сделаны для использования на итерации по элементам списка ,
+1

Проблема памяти, которую вы упомянули, неверна. Вам просто нужно быть осторожным и придать вашим функциям хвост-рекурсивный: https://en.wikipedia.org/wiki/Tail_call –

2

Оба имеют свои преимущества и недостатки, которые в основном зависят от языка программирования.

На аппаратном уровне Recursion поставляется с затратами, каждый раз, когда вы вызываете функцию, основной механизм должен хранить указатель на то, где программа должна перейти в код после завершения функции. Помимо прочего, он также должен хранить аргументы функции и локальную переменную. Все это хранится в стеке программы.

Некоторые проблемы, однако, имеют гораздо более естественное решение при использовании рекурсии, например, tower of hanoi.

Читаемость также является важным соображением, если честно, я считаю, что ваш пример может помочь с циклами.

Дается подробное сравнение между итерацией и рекурсией here. Подводя итог преимуществам и недостаткам.

+1

Рекурсия хвоста решает «сохранить указатель на то, где программа должна перейти в код после завершения функции». Таким образом, стек не растет. Любые ресурсы, не входящие в текущую область функций, освобождаются. –

+0

Я согласен, что существуют подходы, которые решают недостаток рекурсии. Как я уже сказал, это зависит от языка программирования и особенно от базовой реализации его конструкций. Я просто пытался дать общий обзор традиционного способа рекурсии. Рекурсия хвоста не всегда возможна и не реализована на всех языках. Но спасибо, что вы указали это. – DJanssens