Kursova

main.cxx at [ede199dcd5]
Login

main.cxx at [ede199dcd5]

File src/main.cxx artifact 7f432818c7 part of check-in ede199dcd5


#include <iostream>
#include <iomanip>
#include <stack>
#include <array>

// Неободимо для поддержки Unicode
#ifdef _WIN32
#include <windows.h> // SetConsoleOutputCP
#else
#include <locale>
#endif

using std::cin, std::cout, std::endl, std::flush, std::setw;
using std::stack, std::tuple;

void f_rec(const size_t fun_count, const size_t max_recursion_depth, const size_t n = 1, const size_t depth = 0)
{
	cout << setw(depth) << "" << n << endl;

	if (depth >= max_recursion_depth)
		return;

	for (size_t i = 0; i < fun_count - 1; i++)
	{
		f_rec(fun_count, max_recursion_depth, (n + i) % fun_count + 1, depth + 1);
	}
}

void f_iter(const size_t fun_count, const size_t max_recursion_depth)
{
	using stack_item = tuple<size_t, size_t>;

	stack<stack_item> return_stack;
	return_stack.push({1, 0});

	while (!return_stack.empty())
	{
		auto [n, depth] = return_stack.top();
		return_stack.pop();

		stack<stack_item> queue;

		// BEGIN unmodified code
		cout << setw(depth) << "" << n << endl;

		if (depth >= max_recursion_depth)
			continue;

		for (size_t i = 0; i < fun_count - 1; i++)
		{
			queue.push({(n + i) % fun_count + 1, depth + 1});
		}
		// END unmodified code

		while (!queue.empty())
		{
			return_stack.push(queue.top());
			queue.pop();
		}
	}
}

int main()
{

	// Включаем поддержку Unicode
#ifdef _WIN32
	SetConsoleOutputCP(65001);
#else
	std::locale::global(std::locale(""));
#endif

	size_t fun_count;
	size_t max_recursion_depth;

	cout << u8"Кол-во функций: " << flush;
	cin >> fun_count;

	cout << u8"Макс. глубина рекурсии: " << flush;
	cin >> max_recursion_depth;

	cout << u8"Вывод рекурсивной функции:" << endl;
	f_rec(fun_count, max_recursion_depth);

	cout << u8"Вывод нерекурсивной функции:" << endl;
	f_iter(fun_count, max_recursion_depth);

	return 0;
}