首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >哀伤斐波那契

哀伤斐波那契
EN

Code Review用户
提问于 2014-07-13 17:37:36
回答 1查看 2.6K关注 0票数 6

我用回忆录实现了一种计算斐波纳契数的方法。

代码语言:javascript
运行
复制
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);
    }
}

我想要对代码的所有方面的反馈。

EN

回答 1

Code Review用户

回答已采纳

发布于 2014-07-13 18:30:53

此方法是“off”:

代码语言:javascript
运行
复制
private static boolean isInFibonacciList(final int number) {
    return (number <= FIBONACCI_LIST.size() - 1);
}

这可能应该是:

代码语言:javascript
运行
复制
private static boolean isInFibonacciList(final int number) {
    return number < FIBONACCI_LIST.size();
}

这就引出了为什么需要这个函数的问题。只需在代码中包含number < FIBONACCI_LIST.size()

代码语言:javascript
运行
复制
if (number < FIBONACCI_LIST.size()) {
    return FIBONACCI_LIST.get(number);
}

它比以下内容更易读:

代码语言:javascript
运行
复制
if (isInFibonacciList(number)) {
    return FIBONACCI_LIST.get(number);
}

....

private static boolean isInFibonacciList(final int number) {
    return (number <= FIBONACCI_LIST.size() - 1);
}

最后,这个类失败了。考虑用例:

代码语言:javascript
运行
复制
public static void main(String[] args) {
    System.out.println(MemoizedFibonacci.fibonacci(10000));
}

这将尝试10,000个级别的递归,并将失败。类依赖于堆栈深度来确定输入值是否成功。

在这里,递归不是正确的解决方案,迭代方法会更快,并且在更多的情况下工作。

票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/56940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档