interface funcional e recursão

Alexander:

Eu preciso para retornar uma função que retorna o resultado da aplicação da função f ao seu resultado n vezes. Meu código:

public <T> Function<T, T> fN(Function<T, T> f, int n) {
       return (T t) -> fN(f, n - 1).apply(t);
}

Quando eu executar o código, eu recebo java.lang.StackOverflowError. Como eu iria escrever este código para que ele passa os testes a seguir?

Function<Integer, Integer> f1 = (x) -> x + 1;
    assertEquals(13, (int)tasks.fN(f1, 13).apply(0));
    assertEquals(2, (int)tasks.fN(f1, 1).apply(1));

Obrigado pela ajuda.

tomjankes:

A não recursiva, a abordagem trivial:

public <T> Function<T, T> nonRecursiveFN(Function<T, T> f, int n) {
  return (T t) -> {
      T result = t;
      for (int i = 0; i < n; i++) {
        result = f.apply(result);
      }
      return result;
    };
}

Se você precisa usar recursão você precisa de alguma condição de parada como Andreas comentou. Nós podemos implementá-lo usando a função interna que leva função já construída como argumento:

public <T> Function<T, T> fN(Function<T, T> f, int n) {
  return fNInternal(f, n, (x) -> x); //we start with identity function
}

public <T> Function<T, T> fNInternal(Function<T, T> f, int remaining, Function<T, T> functionSoFar) {
  //stop condition - that's how we manage to avoid StackOverflow, you were experiencing
  if (remaining == 0) {
    return functionSoFar;
  }
  //here we apply function to the result of all previous applications
  return fNInternal(f, remaining - 1, (T t) -> f.apply(functionSoFar.apply(t)));
}

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=275962&siteId=1
Recomendado
Clasificación