Дан входной файл на языке C:
int h(int x);
int d(int x);
int e(int x);
int g(int x);
int f(int x)
{
if (x % 2)
{
return 1;
}
return g(x * 3);
}
int g(int x)
{
if (e(x))
{
int s = 0;
for (int i = 0; i < x; i++)
{
s += h(i * e(i));
}
return s;
}
else
{
return x + 1;
}
}
int e(int x)
{
return x ? d(x / 2) : 0;
}
int d(int x)
{
return x * x;
}
int h(int x)
{
return f(e(d(x)));
}
Напишите программу на C#, которая анализирует этот пример и определяет, какие из функций являются потенциально рекурсивными.
Правильный ответ: f
, g
, h
– рекурсивные, d
, e
– нет.
Можно (и нужно) использовать сторонние компоненты помогающие в решении задачи. Вы можете взять парсер С-кода, например ANTLR, clang (libclang.dll, входит в Windows Installer http://llvm.org/builds/) и использовать ее через interop, или воспользоваться готовой оберткой (https://github.com/mjsabby/ClangSharp) или любой другой.
Код должен быть написан в ООП-стиле, быть хорошо читаемым, легко расширяемым. Если Вы используете библиотеки с C-like API, скройте это API за своими классами.
Если у Вас возникнут какие-либо вопросы по ходу написания задания – смело задавайте. На выполнение задания отводится неделя.