2015-01-19 3 views
0

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

Код:

#include <stdio.h> 
int factorial(int input) 
{ 
    if (input > 0) 
    { 
    return input *factorial(input--); 
    } 
return 1; 
} 

int main() 
{ 
printf("%d",factorial(23)); 
return 0; 
} 

Таким образом, в первом я думал, что будет переполнение, поэтому я попытался цифры, как 2 и 3, по-прежнему не работает. Так что я подумал, что это будет работать, если я добавлю

int x = 23; 

и обмена 23 с «& х» в функции печати. Не работает.

Спасибо за любую помощь.

ответ

2

Выражение

return input *factorial(input--); 

делает пост приращение input. Значение, прошедшее до factorial, по-прежнему input.

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

Учитывая input = 3,

input *factorial(input--); 

легко будет:

2 *factorial(3); 

или

3 *factorial(3); 

Вы должны использовать:

return input *factorial(input-1); 
+0

15 секунд паузы в комментариях, и теперь я ударил эту кнопку в 4 раза слишком рано, поэтому обратный отсчет сброса xD Спасибо за ваш ответ, теперь он работает просто отлично :) –

3

Оператор input-- передает текущее значение, затем уменьшает переменную, и вы получаете бесконечный цикл.

Использование input * factorial(input - 1).

Вы можете использовать input * factorial(--input). В этом случае input будет сначала уменьшаться, а затем использоваться, поэтому вы разбиваете бесконечную рекурсию.

Но это плохая идея. Факт - операторы (т. Е. '*' В этом случае) могут вычислять операнды в любом порядке. F.E. компилятор может вычислить второй операнд, то есть factorial(--input), а затем значение input будет уменьшено.

После умножения вашего результата будет newInput * factorial(newInput), пока вы хотите получить oldInput * factorial(newInput).

Самое тревожное, результат зависит от версии компилятора или параметров командной строки, поэтому вы не можете точно предсказать ее.

+1

Если вы используете '--input', вы находитесь на неопределенной территории поведения, так как в выражении также используется' input'. –

+0

@RSahu, вы правы, лучше использовать 'input - 1'. Я исправил свой ответ. –

+0

Благодарим вас за ответы, теперь это работает просто отлично :) –

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