Задать вопрос
kykyryky
@kykyryky

Как выбрать какую функцию вызвать на этапе выполнения программы?

Здравствуйте. Прошу не ругать за бредовое название вопроса, не представляю как такую вещь назвать правильно.

У меня есть метод, которая осуществляет поиск минимума функции двух переменных. В этом методе для вычисления значения функции при заданных переменных вызывается метод, выглядящий например так:
double f1(double x1, double x2)
        {
            return 18 * x1 * x1 - 18 * x1 - 12 * x1 * x2 + 8 * x2 * x2 - 12 * x2;
        }


Чтобы решить мою задачу для другого уравнения, я, к примеру, могу написать функцию f2 с аналогичным телом и проделать всё то же самое, но для этого придется или заменять f1 на f2 в старом методе, или создать такой же новый метод, но уже с f2.

Можно ли это реализовать как-то более грамотно средствами C#?
Пока всё что пришло в голову, это представить функцию как строку и делать разбор выражения. Но это не вариант.
  • Вопрос задан
  • 179 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
Mrrl
@Mrrl
Заводчик кардиганов
Например, так:
double FindMinimum(Func<double,double,double>F,out double x1,out double x2){
     x1=x2=0;
     return F(x1,x2);
}

Тогда вызов поиска минимума будет double zmin=FindMinimum(f1,out x,out y);
Ответ написан
Комментировать
@Alexander1705
Так как имя функции по сути является указателем, то этот указатель можно передать, как аргумент другой функции.

Указатель на функцию можно использовать следующим образом:
// Некоторая функция
float func(float x1, float x2);

// Указатель на функцию: возвращаемый_тип (* имя_указателя)(типы_аргументов)
float (*func_pointer)(float, float);

// Указателю можно присвоить только функции имеющие такую же 
// сигнатуру (возвращаемый тип и типы аргументов)
func_pointer = func;

// Указатель на функцию может быть аргументом
double findMinimum(x1, x2, float (*func_arg)(float, float)) {
    // Вызвать функцию через указатель можно также как и обычную функцию
    // потому, что имя функции тоже является указателем
    float x = func_arg(x1, x2);
}

// Чтоб передать указатель на функцию, нужно просто написать имя функции без скобок
cout << findMinimum(1, 2, func) << '\n';
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы