Примеры программ к Лабораторной работе N10. "Рекурсия"
// factor.c - использует циклы и рекурсию для вычисления факториала
#include <stdio.h>
long fact(int n);
long rfact(int n);
int main(void){
int num;
printf("Эта программа вычисляет факториалы.\n");
printf("Введите значение в диапазоне 0-12 (или q для завершения программы): ");
while (scanf("%d", &num) == 1) {
if (num < 0)
printf("Пожалуйста, не вводите отрицательные числа.\n");
else if (num > 12)
printf("Входное значение должно быть меньше 13.\n");
else
{
printf("цикл: факториал %d = %ld\n", num, fact (num));
printf("рекурсия: факториал %d = %ld\n", num, rfact (num));
}
printf("Введите значение в диапазоне 0-12 (или q для завершения программы): ");
}
printf("Всего хорошего.\n");
return 0;
}
long fact(int n) // функция на базе цикла
{
long ans;
for (ans = 1; n > 1; n--)
ans *= n;
return ans;
}
long rfact(int n) // рекурсивная версия
{
long ans;
if (n > 0){
printf("n=%d\n",n);
ans= n * rfact(n-1);
printf("ans=%ld\n",ans);
} else
ans = 1;
return ans;
}
/* fibonacci.c - пример расчёта чисел Фибоначчи */
#include <stdio.h>
long Fibonacci(int n){
if (n > 2) return Fibonacci(n-1) + Fibonacci(n-2);
else return 1;
}
int main (void){
int number;
printf("Введите целое число (или q для завершения программы): ");
while (scanf("%d", &number) == 1){
printf("Последовательность Фибоначчи: ");
for (int i = 1; i <= number; i++) // В цикле выводим number чисел Фибоначчи
printf("%ld ", Fibonacci(i));
printf("\n\nВведите целое число (или q для завершения программы): ");
}
printf("Программа завершена.\n");
return 0;
}
/* recur.c - иллюстрация рекурсии */
#include <stdio.h>
void up_and_down(int);
int main(void){
up_and_down(1);
return 0;
}
void up_and_down(int n){
printf("Уровень %d: ячейка n %p\n", n, &n) ; /* 1 */
if (n < 4) up_and_down(n+1);
printf("УРОВЕНЬ %d: ячейка n %p\n", n, &n); /* 2 */
}
/* tower.c - пример "Ханойские башни" */
#include <stdio.h>
void TowerMove(// перенос пирамиды
int n, // из n дисков
short i, // со стержня i
short j, // на стержень j,
short k // используя стержнень k как вспомогательный
)
{
// проверка граничного условия - пустую пирамиду не перемещаем
if (!n)
return;
TowerMove(n-1, i, k, j);
// переносим одно кольцо фактически это TowerMove(1, i, j, k);
printf("%2d -> %2d\n", i, j);
TowerMove(n-1, k, j, i);
}
int main(int argc, char* argv[])
{
TowerMove(5, 1, 3, 2);
return 0;
}