60 lines
2.5 KiB
C++
60 lines
2.5 KiB
C++
/*
|
|
Некоторая рекурсивная функция func от трех целых аргументов a, b, k (a, b >= 1, k >= 0) определена следующим образом:
|
|
|
|
func(a, b, k) == a + b при k == 0
|
|
func(a, b, k) == a при k > 0, b == 1
|
|
func(a, b, k) == f(a, f(a, b - 1, k), k - 1) при k > 0, b > 1
|
|
|
|
На стандартном потоке ввода подаются тройки чисел: два 64-битных знаковых целых положительных числа a, b и 32-битное целое неотрицательное число k. Для каждой тройки чисел на стандартный поток вывода напечатайте значение описанной выше функции.
|
|
|
|
Параметры на входе будут таковы, что вычисление завершится за разумное время. Для вычислений достаточно 64-битного целого знакового типа.
|
|
|
|
Для возврата значения из рекурсии используйте исключения. Выход из рекурсивной функции с помощью явного или неявного return запрещен.
|
|
|
|
Напишите свой класс (например, Result) для передачи результата вычислений вместе с исключением. Не используйте выбрасывание исключений базовых (например, int) типов.
|
|
|
|
В комментарии в начале программы опишите, что из себя представляет эта рекурсивная функция.
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
class Result {
|
|
long long val;
|
|
public:
|
|
Result(long long val) : val(val) {}
|
|
long long value() const { return val; }
|
|
};
|
|
|
|
// Функция определена по условию. Выкидывает результат в виде exception
|
|
void f(long long a, long long b, int k) {
|
|
if (k == 0) {
|
|
throw Result(a + b);
|
|
}
|
|
|
|
if (b == 1) {
|
|
throw Result(a);
|
|
}
|
|
|
|
try {
|
|
f(a, b - 1, k);
|
|
}
|
|
catch (const Result& result) {
|
|
f(a, result.value(), k - 1);
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
long long a, b;
|
|
int k;
|
|
while (std::cin >> a >> b >> k) {
|
|
try {
|
|
f(a, b, k);
|
|
}
|
|
catch (const Result& result) {
|
|
std::cout << result.value() << std::endl;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
} |