功能接口和递归

Functional interface and recursion

我需要 return 一个函数,该函数 return 是将函数 f 应用于其结果 n 次的结果。 我的代码:

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

当我 运行 代码时,我得到 java.lang.WhosebugError。我该如何编写此代码才能通过以下测试?

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));

感谢您的帮助。

非递归、简单的方法:

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;
    };
}

如果您需要使用递归,您需要一些停止条件,正如 Andreas 评论的那样。我们可以通过使用内部函数来实现它,该函数将已经构造的函数作为参数:

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 Whosebug, 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)));
}