2015-11-04 6 views
1

В классе, который я принимаю, мой учитель не поощряет студентов от вызова функций рекурсивно. Например, если я хочу, чтобы вызвать основную функцию в следующем коде:Почему плохо вызывать функции рекурсивно?

if (x > 5) { 
    printf("Your number's too high. Enter a number below 5."); 
    main(); 
} 

Я вместо этого рекомендуется использовать:

int x; 
while (x > 5) { 
    printf("\nYour number's too high. Enter a number below 5."); 
    scanf("%d", &x); 
} 

Хотя я понимаю, что функция в то время как более простой способ идя по этой конкретной проблеме, нам говорят избегать рекурсии в целом, особенно с main(). Однако я думал, что это довольно важная концепция, используемая в программировании. Почему этого следует избегать, особенно при вызове main()?

+4

'основной()', как правило, имеют некоторый код установки и инициализации в нем, так это вообще плохая идея рекурсии в этом случае. Используйте рекурсию только тогда, когда она действительно имеет смысл - какой-то алгоритм разделения и покорения, а не как замена цикла. – javanut13

+0

иногда проблемы с переполнением стека ... вызов функции рекурсивно добавляет большую нагрузку на память «иногда». Это обычно не поощряется. – beebee

+2

Это не «плохой вызов функции рекурсивно». Это * IS * плохо называть «main()» функцией! Также плохо использовать рекурсию (которая связана с некоторыми накладными расходами), если простой цикл будет работать лучше. Вот полезный поток: http://cboard.cprogramming.com/c-programming/8216-when-use-recursion.html – paulsm4

ответ

4

Большой вопрос.

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

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

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

Вы можете узнать больше о том, что делают компиляторы, чтобы сделать все, что мы принимаем как должное (функции, циклы), прочитав об архитектуре компьютера и ассемблере.

Например, проверить класс материалов UC Беркли по теме: http://www-inst.eecs.berkeley.edu/~cs61c/fa15/

Смежные вопросы