Multiple solutions of Fibonacci (Python or Java)

本章是用英文写的,作为或想成为一名优秀的攻城狮,习惯阅读英文文档将使你受益良多。例如更好的查看最新版的官方文档、与国外友人交流、等等 其实英文的生词也并不多,其中90%的英文都在代码里,当然这其中的精华也在代码里,代码相信大部分伙计还是都可以看懂.所以,请不要惊慌。对于English,让我们一起取克服它、习惯它、拥抱它。然后把它锤倒在地,相信你可以的。 GO, Go, GO 如果实在不行,各种页面翻译来一手。莫慌,这都是小场面,啥都不是事儿,好吧

Violence law(Top-down)

It can be solved directly according to the known conditions (f (0) = 0, f (1) = 1 F(N) = F(N - 1) + F(N - 2), for N > 1)

Python Code

1

2

3

4

class Solution:

def fib(self, N: int) -> int:

if N == 1 or N == 2: return N

return self.fib(N - 1) + self.fib(N - 2)

Java Code

1

2

3

4

5

6

7

8

9

10

11

12

class Solution {

public int fib(int N) {

if (N == 1 || N == 2) return 1;

return fib(N - 1) + fib(N - 2);

}

}

class Solution {

public int fib(int N) {

return N < 2 ? N : fib(N - 1) + fib(N - 2);

}

}

Violence law add cache(Pruning)

We know that if we don’t do any processing, we will repeat too many calculations, which is very bad The processing idea will avoid repeated calculation

Python Code

1

2

3

4

5

class Solution2:

@functools.lru_cache()

def fib(self, N: int) -> int:

if N <= 1: return N

else: return self.fib(N - 1) + self.fib(N - 2)

Java Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class Solution {

private Integer[] cache = new Integer[31];

public int fib(int N) {

if (N <= 1) return N;

cache[0] = 0;

cache[1] = 1;

return memoize(N);

}

public int memoize(int N) {

if (cache[N] != null) return cache[N];

cache[N] = memoize(N-1) + memoize(N-2);

return memoize(N);

}

}

Divide and conquer solution

Recursion, iteration, divide and conquer, backtracking, they do not have a clear distinction Recursion:The core idea is to govern separately and unify the officials

1

2

3

4

5

6

7

class Solution:

def fib(self, N: int) -> int:

memo = {}

if N < 2: return N

if N-1 not in memo: memo[N-1] = self.fib(N-1)

if N-2 not in memo: memo[N-2] = self.fib(N-2)

return memo[N-1] + memo[N-2]

Dynamic recursion(Bottom up)

Basic solutions

More initial value, continuous dynamic recursive

Python Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

class Solution:

def fib(self, N: int) -> int:

if N < 2: return N

dp = [0 for _ in range(N + 1)]

dp[0], dp[1] = 0, 1

for i in range(2, N + 1):

dp[i] = dp[i - 1] + dp[i - 2]

return dp[- 1]

class Solution:

def fib(self, N: int) -> int:

if N == 0: return 0

memo = [0,1]

for _ in range(2,N+1):

memo = [memo[-1], memo[-1] + memo[-2]]

return memo[-1]

Java Code

1

2

3

4

5

6

7

8

9

10

11

12

13

class Solution {

public int fib(int N) {

if (N <= 1) return N;

if (N == 2) return 1;

int curr = 0, prev1 = 1, prev2 = 1;

for (int i = 3; i <= N; i++) {

curr = prev1 + prev2;

prev2 = prev1;

prev1 = curr;

}

return curr;

}

}

Use better base types (tuples) to improve performance

1

2

3

4

5

6

7

class Solution:

def fib(self, N: int) -> int:

if N == 0: return 0

memo = (0,1)

for _ in range(2,N+1):

memo = (memo[-1], memo[-1] + memo[-2])

return memo[-1]

Better solutions

Python Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class Solution:

def fib(self, N: int) -> int:

curr, prev1, prev2 = 0, 1, 1

for i in range(3, N + 1):

curr = prev1 + prev2

prev2 = prev1

prev1 = curr

return curr

class Solution5:

def fib(self, N: int) -> int:

prev, now = 0, 1

for i in range(N):

prev, now = now, now + prev

return prev

Java Code

1

2

3

4

5

6

7

8

9

10

11

12

13

class Solution {

public int fib(int N) {

if (N == 0) return 0;

if (N == 2 || N == 1) return 1;

int prev = 1, curr = 1;

for (int i = 3; i <= N; i++) {

int sum = prev + curr;

prev = curr;

curr = sum;

}

return curr;

}

}

Mathematical conclusion method

Python Code

1

2

3

4

5

class Solution:

def fib(self, N: int) -> int:

sqrt5 = 5 ** 0.5

fun = pow((1 + sqrt5) / 2, n + 1) - pow((1 - sqrt5) / 2, n + 1)

return int(fun / sqrt5)

Java Code

1

2

3

4

5

6

class Solution {

public int fib(int N) {

double sqrt5 = (1 + Math.sqrt(5)) / 2;

return (int)Math.round(Math.pow(sqrt5, N)/ Math.sqrt(5));

}

}

java遍历斐波纳契数列_详解循环、迭代、递归、分治(Leet Code 509 斐波那契数列),实际运用...相关推荐

  1. java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...

  2. java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验

    why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收B ...

  3. java类与接口思维导图_详解java接口基础知识附思维导图

    接口: 官方的含义是---->java接口是一系列方法的声明,是一些方法特征的集合 疑问: 那为什么不用抽象类呢?把他们共有的方法集合起来放在一个抽象类里面,同样可以调用哇,但是反过来想一想如果 ...

  4. Java API源码在哪里找_详解查看JAVA API及JAVA源码的方法

    在java的日常学习中,我们有时候会需要看java的api说明,或者是查看java的源码,使我们更好的了解java,接下来我就来说说如何查看java的api以及java源码 对于java的api,一般 ...

  5. java中的静态变量的作用域_详解JAVA中static的作用

    1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说 ...

  6. java中bean的定义有哪些_详解Java的Spring框架中bean的定义以及生命周期

    bean的定义形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean.bean被实例化,组装,并通过Spring IoC容器所管理的对象.这些bean由容器提供,例如,在XML的定义, ...

  7. java事务是基于数据库的么_详解在Spring Boot中使用数据库事务

    我们在前面已经分别介绍了如何在spring Boot中使用JPA以及如何在Spring Boot中输出REST资源.那么关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到 ...

  8. java泰坦宙斯之战程序_详解Hadoop作业平台宙斯Zeus.pdf

    详解Hadoop作业平台宙斯Zeus 杨⻜ 分布式研发⼯程师 开源爱好者 技术顾问 邮箱:yangf_sky@163.com 博客:/yangfei001 微博:/u/1664659850 内容⼤纲 ...

  9. python哪些类型可以作为迭代器_详解Python迭代和迭代器

    我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange. 可迭代 一个对象,物理或者虚拟存储的序列.list,tuple,strins,dicttionary, ...

最新文章

  1. Windows Phone 7中配置gmail, 使用outlook 同步邮件,日历,联系人等
  2. 《写给大家看的Web设计书(第3版)》即将上市
  3. 初探 Headless Chrome
  4. raid5需要几块硬盘_Raid5磁盘阵列数据恢复思路分析--附真实案例
  5. 04 理解SQL与T-SQL的概念测试分析 1214
  6. 给键盘上的enter设置事件_Selenium3 + Python3自动化测试系列——鼠标事件和键盘事件...
  7. Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)
  8. 【Hbase】HBase数据快速导入之ImportTsv
  9. 解决使用adprep升级windows2003/win2008/win2012域时遇到的问题
  10. python tkinter frame滚动条_如何在Tkinter中创建带有滚动条的LabelFrame?
  11. 易语言html代码解释器,易语言执行javascript
  12. 暖通工程师有几个级别,以及注册暖通工程师挂靠价格
  13. 编译原理 词法分析 算符优先分析法
  14. 搭建PHP环境需要安装Apache服务器,遇到的一系列的问题(切记需要用管理权限进入CMD)
  15. 【计算机视觉学习一】计算机视觉简述
  16. [os]os vmware 手机连接
  17. 利用CMD命令有效的查病毒***方法
  18. 华为又一名8年程序员跳楼,末位淘汰制,大龄程序员未来该怎样走?
  19. wiegand 问题
  20. 项目之利用 V4L2应用程序框架 进行视频录制

热门文章

  1. 神龙X-Dragon,这技术“范儿”如何?| 问底中国IT技术演进
  2. 反转!2019程序员吸金榜来了,AI程序员刷爆了..
  3. Docker,一个傲娇的男人
  4. 为什么你的年薪只是别人的月薪?你需要技术专家帮你「充电」
  5. 官宣!张小龙史上最长演讲 4小时3万字完整版回应微信的一切
  6. python编写加密程序_用Python实现一个简单的加密程序
  7. windows下RocketMQ下载、安装、部署、控制台
  8. 到底什么是空指针?如何避免空指针_01
  9. 使用IDEA 1分钟搭建运行SpringMVC项目
  10. 第九篇:Spring Boot整合Spring Data JPA_入门试炼02