Вопрос: Как правильно сделать функцию для повторяющихся действий?

Лучший ответ: Вы не поверите, но просто взять и сделать отдельным методом/функцией))
параметры для функции определить не можете?? ..разбирайте тогда примеры попроще, учитесь. разве не для этого такие задания/лабораторные работы делают

Худший ответ: Попробуйте рассматривать функцию в программировании как некоторый участок кода который выполняет определенное действие.
Давайте разберем на примере вашего задания:Заданы три функции 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() для форматирования перечисления. А также добавить описание для функции. Можно использовать кортеж - (описание, функция). 
Если возникнут вопросы - не стесняйтесь спрашивать, буду рад помочь.