Примеры программ к Лабораторной работе 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;
}