复习 - 斐波那契数列
斐波那契数列(Fibonacci sequence)
前言: 斐波那契数列是最基础最常见的了,但是隔很久不仅是对语言,对这个也开始生疏了。这里做一次复习并用几种常用语言来实现。
又称黄金分割数列
、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列
”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1,F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。——摘自《百度百科》
第一种方法使用的是经典的递归算法
最后的结果为:
1 1 2 3 5 8 13 21 34
go 实现
package main import . "fmt" func fibonacci(n int) int { if n < 2 { return n } return fibonacci(n-2) + fibonacci(n-1) } func main() { var i int for i = 0; i < 10; i++ { Printf("%d\t", fibonacci(i)) } }
使用闭包,匿名函数作为返回值的算法实现。
package main import . "log" func main() { f := fibonacci() var i int for i = 1; i < 10; i++ { Printf("NO.%d = %d\t", i, f()) } } func fibonacci() func() int { x, y := 0, 1 return func() int { y = x + y return y } }
python 实现
递推法:
def fibonacci(i): if i == 1 or i == 2: return 1 return fibonacci(i-2) + fibonacci(i-1) for i in range(1, 10): print(fibonacci(i), end=' ')
下面利用闭包,但这种方法每次都需要计算一项斐波那契数列的值,所以他的时间复杂度是 O(n)。
def fibonacci(): x, y = 0, 1 def sum(): nonlocal x, y temp = x + y x, y = y, temp return temp return sum fib = fibonacci() for i in range(1, 10): print(fib(), end=' ')
学习一下:矩阵乘法是一种预处理斐波那契数列的方法,它可以在 O(log n) 的时间内计算任意项的值。
def matrix_multiply(a, b): c = [[0, 0], [0, 0]] for i in range(2): for j in range(2): for k in range(2): c[i][j] += a[i][k] * b[k][j] return c def matrix_power(matrix, n): if n == 1: return matrix elif n % 2 == 0: return matrix_power(matrix_multiply(matrix, matrix), n//2) else: return matrix_multiply(matrix, matrix_power(matrix, n-1)) def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: matrix = [[1, 1], [1, 0]] result = matrix_power(matrix, n-1) return result[0][0] for i in range(10): print(fibonacci(i), end=' ')
解释:
首先定义了一个函数 matrix_multiply接受两个 2x2 的矩阵作为参数,并返回它们的乘积。定义了一个 2x2 的矩阵 c,值初始化为 0。然后使用三层循环来遍历每一个元素。其中,第一层循环遍历矩阵 a 和 c 的行,第二层循环遍历矩阵 b 的列,第三层循环遍历矩阵 a 的列和矩阵 b 的行。每次循环将矩阵 a 和 b 的对应元素相乘,并将结果累加到矩阵 c 的对应元素上。最后,返回矩阵 c。
还定义了一个函数 matrix_power,它接受一个 2x2 的矩阵和一个整数 n 作为参数,并返回矩阵的 n 次方。
其他语言的基本实现:
Java 实现
package com.study.bk; public class Fibonacci { public static int fibonacci(int i) { if (i == 1 || i == 2) { return 1; } return fibonacci(i-2) + fibonacci(i-1); } public static void main(String[] args) { for (int i = 1; i < 10; i++) { System.out.print(fibonacci(i) + " "); } } }
C 实现
#include "stdio.h" int fibonacci(int i){ if (i == 1 || i == 2) return 1; return fibonacci(i-2) + fibonacci(i-1); } int main(){ for (int i = 1; i < 10; i++){ printf("%d ", fibonacci(i)); } return 0; }
本文作者:lockly
本文链接:https://www.cnblogs.com/bktown/p/17690970.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)