Попробуйте рассматривать функцию в программировании как некоторый участок кода который выполняет определенное действие.
Давайте разберем на примере вашего задания:
Заданы три функции y1=x^3, y2=x^3+1, y3= 1/(1+x^2). Определить, являются ли эти функции четными или нечетными.
Вас может смущать число "три" в формулировке, отбросьте его как не существенное, тогда будет проще понять как правильно поступить. Переформулируем, оставив только самую суть:
Определить четность функций.
Возьмем определение "четности":
Нечётными и чётными называются функции, обладающие симметрией относительно изменения знака аргумента.
Так как функция может быть произвольная, то можно лишь говорить о свойствах на некотором интервале с заданным шагом.
Определим тип функции в виде перечисления:
public enum FuncType { Odd, Even, Unknown };
Нам понадобиться функция которая будет определять тип функции для конкретной точки:
Func<double, FuncType> isEven = v =>
{
var y1 = func(v);
var y2 = func(-v);
if (y1 == y2)
return FuncType.Even;
if (y1 == -y2)
return FuncType.Odd;
return FuncType.Unknown;
};
и функция для суммирования двух состояний:
Func<FuncType, FuncType, FuncType> add = (v1, v2) =>
{
if (v1 == v2) return v2;
return FuncType.Unknown;
};
теперь, чтобы не делать ненужные проверки, нужен способ вернуть результат сразу как только станет понятно, что функция не является ни четной ни нечетной:
Для начала нужно определить "состояние" функции для первой точки (a) и, если, однозначного ответа нет, то можно возвращать результат - в дальнейших вычислениях нет необходимости:
var funcType = isEven(a);
if (funcType == FuncType.Unknown)
return FuncType.Unknown;
теперь, когда предварительная обработка сделана, можно писать цикл:
for (double x = a + step; x <= b; x += step)
{
var funcTypeNext = isEven(x);
funcType = add(funcType, funcTypeNext);
if (funcType == FuncType.Unknown)
return FuncType.Unknown;
}
и в итоге нужно вернуть
funcType.
Полностью функция выглядит так:
public static FuncType IsEvenFunction(Func<double, double> func, double a, double b, double step)
{
Func<double, FuncType> isEven = v =>
{
var y1 = func(v);
var y2 = func(-v);
if (y1 == y2)
return FuncType.Even;
if (y1 == -y2)
return FuncType.Odd;
return FuncType.Unknown;
};
Func<FuncType, FuncType, FuncType> add = (v1, v2) =>
{
if (v1 == v2) return v2;
return FuncType.Unknown;
};
var funcType = isEven(a);
if (funcType == FuncType.Unknown)
return FuncType.Unknown;
for (double x = a + step; x <= b; x += step)
{
var funcTypeNext = isEven(x);
funcType = add(funcType, funcTypeNext);
if (funcType == FuncType.Unknown)
return FuncType.Unknown;
}
return funcType;
}
Проверка:
Func<double, double> fn1 = x => x * x * x;
Func<double, double> fn2 = x => x * x * x + 1;
Func<double, double> fn3 = x => 1 / (1 + x * x);
Console.WriteLine("Fn1: {0}", IsEvenFunction(fn1, 1, 10, 0.01));
Console.WriteLine("Fn2: {0}", IsEvenFunction(fn2, 1, 10, 0.01));
Console.WriteLine("Fn3: {0}", IsEvenFunction(fn3, 1, 10, 0.01));
Теперь что касается вывода как у вас примере, попробуйте добавить функцию
.ToString() для форматирования перечисления. А также добавить описание для функции. Можно использовать кортеж -
(описание, функция).
Если возникнут вопросы - не стесняйтесь спрашивать, буду рад помочь.