Как я могу реализовать этот фрагмент Python в Java? - PullRequest
1 голос
/ 20 мая 2010

У меня есть этот код Python, который я нашел в Интернете и хотел бы знать, как перевести его на Java. Мой вопрос не об алгоритме, а о том, как обрабатывать аргументы функции.

Вот код:

def ternarySearch(f, left, right, absolutePrecision):
    #left and right are the current bounds; the maximum is between them
    if (right - left) < absolutePrecision:
        return (left + right)/2

    leftThird = (2*left + right)/3
    rightThird = (left + 2*right)/3

    if f(leftThird) < f(rightThird):
        return ternarySearch(f, leftThird, right, absolutePrecision)

    return ternarySearch(f, left, rightThird, absolutePrecision)

Я хотел бы знать, как будет выглядеть определение функции. Например, функция, возвращающая y=x^2+3, будет выглядеть так:

public static int y(int x){
 return x*x+3;
}

но

 return ternarySearch(f, leftThird, right, absolutePrecision)

не работает для меня, и я хотел бы знать, что делать.

Обновление:

так, например, у меня есть y = 3 * x + 2, это будет так?

interface MyFunctor {
 int myFunction(int x);
}

class MyFunctorImpl implements MyFunctor {
  int myFunction(int  x) {
      return 3*x+2
  }
}

как это?

1 Ответ

8 голосов
/ 20 мая 2010

В Java нет функций высшего порядка. То есть вы не можете передать функцию в качестве аргумента другой функции. Что вы можете сделать, это использовать шаблон Command; определите интерфейс, поддерживающий нужный вам метод, затем передайте экземпляр этого интерфейса, реализующего метод.

Например:

int ternarySearch(MyFunctor f, int left, int right, float absolutePrecision) {
  #left and right are the current bounds; the maximum is between them
  if (right - left) < absolutePrecision:
    return (left + right)/2

  leftThird = (2*left + right)/3
  rightThird = (left + 2*right)/3

  if (f.myFunction(leftThird) < f.myFunction(rightThird)) {
    return ternarySearch(f, leftThird, right, absolutePrecision)
  }
  return ternarySearch(f, left, rightThird, absolutePrecision)
}

и

interface MyFunctor {
  int myFunction(int arg);
}

и

class MyFunctorImpl implements MyFunctor {
  int myFunction(int arg) {
     // implementation
  }
}

Тогда вы можете вызвать ternarySearch с экземпляром MyFunctorImpl в качестве первого аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...