2011-04-11 3 views
0
void factorial(int n) 
{ 

if(n ==0) 
return 1; 

int value = n*factorial(n-1); 
printf("the value is %d", value) 
} 

предполагают ввод функция 4.C выделение стека # рекурсии

поэтому количество звонков 5.

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

void factorial(4) 
{ 

if(4 == 0) 
return 1; 

int value = 4*factorial(3) 
printf ("the value is %d",value); 

} 

void factorial(3) 
{ 
if(3 ==0) 
return 1; 

int value = 3* factorial (2); 




} 

мой вопрос для каждого вызова, код генерируется как указанное выше в стеке }

}

+0

printf не C#, это C - требуется повторная маркировка? –

ответ

0

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

+0

, так как происходит рекурсия, если функция содержит локальные вайрабли и если эти переменные становятся входными для функции рекурсии – Racs

+1

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

+0

@Raghav: Рекурсия происходит точно так же, как и у вас в коде. Функция, которая называет себя (надеюсь, с завершающим условием, конечно). Сам код не входит в стек вызовов, просто указатель на то, где этот код живет в памяти. Таким образом, каждый элемент, добавленный в стек во время рекурсии, указывает на то же место для исполняемого кода. – David

3

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

Читайте здесь для получения дополнительной информации: http://en.wikipedia.org/wiki/Call_stack

Так в основном есть stack pointer, который указывает на самую высокую точку в stack и для каждой функции этот указатель увеличивается на количество байтов, необходимых для локальных переменных и некоторой системы распределение информации. И он возвращается после завершения вызова функции.

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