功能接口和递归
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)));
}
我需要 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)));
}