我用回忆录实现了一种计算斐波纳契数的方法。
public class MemoizedFibonacci {
private static final List<BigInteger> FIBONACCI_LIST = new ArrayList<>();
static {
FIBONACCI_LIST.add(BigInteger.ZERO);
FIBONACCI_LIST.add(BigInteger.ONE);
}
public static BigInteger fibonacci(final int number) {
if (number < 0){
throw new IllegalArgumentException("negative number: " + number);
}
if (isInFibonacciList(number)) {
return FIBONACCI_LIST.get(number);
}
BigInteger fibonacci = fibonacci(number - 1).add(fibonacci(number - 2));
FIBONACCI_LIST.add(fibonacci);
return fibonacci;
}
private static boolean isInFibonacciList(final int number) {
return (number <= FIBONACCI_LIST.size() - 1);
}
}
我想要对代码的所有方面的反馈。
发布于 2014-07-13 18:30:53
此方法是“off”:
private static boolean isInFibonacciList(final int number) {
return (number <= FIBONACCI_LIST.size() - 1);
}
这可能应该是:
private static boolean isInFibonacciList(final int number) {
return number < FIBONACCI_LIST.size();
}
这就引出了为什么需要这个函数的问题。只需在代码中包含number < FIBONACCI_LIST.size()
。
if (number < FIBONACCI_LIST.size()) {
return FIBONACCI_LIST.get(number);
}
它比以下内容更易读:
if (isInFibonacciList(number)) {
return FIBONACCI_LIST.get(number);
}
....
private static boolean isInFibonacciList(final int number) {
return (number <= FIBONACCI_LIST.size() - 1);
}
最后,这个类失败了。考虑用例:
public static void main(String[] args) {
System.out.println(MemoizedFibonacci.fibonacci(10000));
}
这将尝试10,000个级别的递归,并将失败。类依赖于堆栈深度来确定输入值是否成功。
在这里,递归不是正确的解决方案,迭代方法会更快,并且在更多的情况下工作。
https://codereview.stackexchange.com/questions/56940
复制相似问题