Язык Си в примерах/Факториал: различия между версиями
Ramir (обсуждение | вклад) мНет описания правки |
Поставил теги <source> |
||
Строка 7: | Строка 7: | ||
В приведенной ниже программе определена функция <tt>factorial</tt>, вычисляющая факториал. |
В приведенной ниже программе определена функция <tt>factorial</tt>, вычисляющая факториал. |
||
<source lang="c">#include <stdio.h> |
<source lang="c"> |
||
#include <stdio.h> |
|||
long factorial(long x) { |
long factorial(long x) { |
||
if( x == 0 ) return 1; |
if( x == 0 ) return 1; |
||
Строка 16: | Строка 17: | ||
while( scanf("%ld", &n) == 1) |
while( scanf("%ld", &n) == 1) |
||
printf("%ld\n", factorial (n)); |
printf("%ld\n", factorial (n)); |
||
} |
|||
</source> |
|||
Это определение основано на следующей '''рекуррентной''' |
Это определение основано на следующей '''рекуррентной''' |
Версия от 16:11, 5 июня 2007
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
Факториал числа n это произведение первых n натуральных чисел:
В приведенной ниже программе определена функция factorial, вычисляющая факториал.
#include <stdio.h>
long factorial(long x) {
if( x == 0 ) return 1;
return x * factorial (x - 1);
}
void main() {
long n;
while( scanf("%ld", &n) == 1)
printf("%ld\n", factorial (n));
}
Это определение основано на следующей рекуррентной формуле:
Для вычисления факторила n! эта функция вызывает саму себя с аргументом n-1
Если бы не было строчки
if( n == 0 ) return 1;
то функция factorial постоянно бы вызывала саму себя, и во время выполнения программы мы получили бы сообщение об ошибке "переполнение стека" или "превышена глубина рекурсии". Для того, чтобы этого не было, необходимо, чтобы при некоторых значения аргумента, функция не вызывала саму себя, а вычисляла свое значение "самостоятельно".
Идея рекурсии заключается в сведении задачи к этой же задаче, но для более простых случаев (например, для меньшего значения аргумента n). Процесс сведения задачи к предыдущей должен когда-нибудь заканчиваться, поэтому рекурсивные функции для простейших входных данных должны "знать", чему они равны и не делать рекурсивных вызовов.
Задания
- Улучшите программу, добавив к ней защиту от дурака: если n < 0, то программа должна по-прежнему адекватно работать,например, сообщать, что факториал для отрицательных чисел не определен, и не вызывать Runtime error — ошибку выполнения программы.