首页 > 其他分享 >复习 - 斐波那契数列

复习 - 斐波那契数列

时间:2023-09-10 11:55:18浏览次数:40  
标签:return matrix int 矩阵 数列 斐波 fibonacci 那契 复习

斐波那契数列(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;
}

标签:return,matrix,int,矩阵,数列,斐波,fibonacci,那契,复习
From: https://www.cnblogs.com/bktown/p/17690970.html

相关文章

  • 斐波那契数列
    1描述:这里用Js数组模拟数列。letfn=[];  fn[0]=1;  fn[1]=1;  fn[2]=2----------fn[0]+fn[1];fn[3]=3----------fn[1]+fn[2];这样子:fn=[1,1,2,3,5];设fn的索引为n; 问n==100时候。fn[n]的值。 functiongen_feiblo(num){letinit_arr=[1,1];for(leti=......
  • C语言函数递归 --- 复习题(1)
    一.单选题:1.下列选项关于递归说法错误的是()A.存在限制条件,当满足限制条件时,递归停止B.每次递归调用后越来越接近递归的条件C.递归可以无限制递归下去D.递归层次太深容易出现栈溢出答案:C,这题错误的选项显而易见是C,我们之前将递归的时候就说过递归的两个要求,第一个是需要有限制条......
  • sed文本流式编辑器复习
    Linux持续学习者的实用命令:sed原创 运维家 运维家 2023-09-0316:00 发表于北京收录于合集#linux39个#文本编辑器1个引言作为一名Linux持续学习者,我们经常需要对文本内容进行处理或修改,这时候sed命令就能派上用场了。sed是一个强大的流式文本编辑器,它可以在......
  • 软件评测师考试复习~计算机组成结构必背点
    一、计算机硬件组成计算机的硬件基本系统由五大部分组成:运算器、控制器、存储器、输入设备(eg鼠标键盘)、输出设备(eg显示器);存储器分为:内部存储器、外部存储器。 内部存储器即内存,容量小、速度快、临时存放数据;外部存储器即硬盘光盘等,容量大,速度慢,长期保存数据;外设:输入设备、输......
  • 详细讲解斐波那契数
    前置知识斐波那契数列是一种经典的数学序列,它以递归的方式定义。斐波那契数列的前两个数是0和1,之后的每个数都是前两个数之和。换句话说,数列中的每个数(从第三个数开始)都是前两个数之和。斐波那契数列的数学表达式如下:F(0)=0F(1)=1F(n)=F(n-1)+F(n-2)(对于n≥2)根......
  • kafka复习:(22)一个分区只能被消费者组中的一个消费者消费吗?
    默认情况下,一个分区只能被消费者组中的一个消费者消费。但可以自定义PartitionAssignor来打破这个限制。一、自定义PartitionAssignor.packagecom.cisdi.dsp.modules.metaAnalysis.rest.kafka2023;importorg.apache.kafka.clients.consumer.internals.AbstractPartitionAssign......
  • kafka复习:(24)consume-transform-produce模式
    packagecom.cisdi.dsp.modules.metaAnalysis.rest.kafka2023;importorg.apache.kafka.clients.consumer.*;importorg.apache.kafka.clients.producer.KafkaProducer;importorg.apache.kafka.clients.producer.ProducerConfig;importorg.apache.kafka.clients.produc......
  • Redis复习:(1)RedisTempalte之BitMap操作
    packagecn.edu.tju.service.impl;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.dao.DataAccessException;importorg.springframework.data.redis.connection.RedisConnection;importorg.springframework.data.redis.co......
  • 数据结构复习——王道考研
    数据结构一.绪论1.1基本概念数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。数据类型:是相互之间存在一种或......
  • 【算法】斐波那契数列与台风的故事
    在小岛的一个海滨小镇上,住着一个名叫苏菲的女孩。苏菲一家人靠海为生,她的生活简单而朴素,与大自然和谐共生。每天,苏菲都会来到海边,欣赏那美丽的日出和日落,感受着大海的呼吸。然而,小岛的美丽风光并非一成不变。每年夏季,热带气旋活跃,台风频繁登陆,给小岛带来了严重的危害。有一天,苏......